export FC=ifort
export NETCDF_HOME=/usr/local/netcdf
星期二, 12月 21, 2010
星期二, 12月 07, 2010
NETCDF + CENTOS + ifort 編譯
NETCDF + CENTOS + ifort 編譯
注意1: 如果裝gmt用自編的netcdf出現錯誤,說是curl之類的錯誤,可以先
export NETCDF_LIB="/usr/local/netcdf/lib -lcurl"
再
sh gmt_install.sh gmtvar.txt
注意2: 如果編譯遇到錯誤,說是少了crypt 之類的函數庫,可以試試不要編譯 dap
./configure --prefix=/usr/local/netcdf --disable-dap
下面的系統都試過了,應該沒有問題
netcdf + CentOs 5.4 + ifort 11.1 + icc emt64
先執行下面指令:
export CC=icc
export CXX=icpc
export CFLAGS='-O3 -xT -ip -no-prec-div -static'
export CXXFLAGS='-O3 -xT -ip -no-prec-div -static'
export F77=ifort
export FC=ifort
export F90=ifort
export FFLAGS='-O3 -xT -ip -no-prec-div -static'
export CPP='icc -E'
export CXXCPP='icpc -E'
# 然後
./configure --prefix=/usr/local/netcdf
make
#make test
好像改成
make check
make install
Cygwin + gfortran
export CC=gcc
export FC=gfortran
export F90=gfortran
export F77=gfortran
export CPPFLAGS=-DpgiFortran
./configure --prefix=/usr/local/netcdf/
注意1: 如果裝gmt用自編的netcdf出現錯誤,說是curl之類的錯誤,可以先
export NETCDF_LIB="/usr/local/netcdf/lib -lcurl"
再
sh gmt_install.sh gmtvar.txt
注意2: 如果編譯遇到錯誤,說是少了crypt 之類的函數庫,可以試試不要編譯 dap
./configure --prefix=/usr/local/netcdf --disable-dap
下面的系統都試過了,應該沒有問題
netcdf + CentOs 5.4 + ifort 11.1 + icc emt64
先執行下面指令:
export CC=icc
export CXX=icpc
export CFLAGS='-O3 -xT -ip -no-prec-div -static'
export CXXFLAGS='-O3 -xT -ip -no-prec-div -static'
export F77=ifort
export FC=ifort
export F90=ifort
export FFLAGS='-O3 -xT -ip -no-prec-div -static'
export CPP='icc -E'
export CXXCPP='icpc -E'
# 然後
./configure --prefix=/usr/local/netcdf
make
#make test
好像改成
make check
make install
Cygwin + gfortran
export CC=gcc
export FC=gfortran
export F90=gfortran
export F77=gfortran
export CPPFLAGS=-DpgiFortran
./configure --prefix=/usr/local/netcdf/
防堵暴力 try ssh 密碼
由於有太多的小白喜歡try別人的電腦,所謂的try是指隨便猜一個帳號及密碼,一直試,總有試出來的時候。這種情況太比較大型的網站有效,因為有太多的帳號密碼啦。至於我們實驗室的話,沒幾個帳號,是不會那麼容易被try到。不過既然這是一個問題,那麼能的話還是做些防堵的工作才好。首先當然是要把 root 的帳號登入的權限關掉,因為程式第一個try的一定是root的密碼啦。關掉的方法是把/etc/ssh/sshd_config 裏的 PermitRootLogin yes
改為
PermitRootLogin no
之後重新啟動ssh。
再來是當每次有人用ssh連線時,啟動電腦來執行一個程式,這個程式會檢查/var/log/messages 的檔案,用連線進來的ip及 Faile password為關鍵字進行篩選,如果在一個小時內有錯過10次的連線的話,就叫防火牆把它的ip檔住,不再讓它連啦。
上面的文字包含二個重點,一個是如何在有使用者用ssh連線時去執行某程式;另一個是如何檢查log檔,看該使用者是否有try超過10次錯誤。
第一個問題的答案在/etc/hosts.allow 這個檔案裏有解。
在這個檔案裏加一行
sshd : ALL : spawn (/root/bin/block_ssh.pl %c %d)
第一個是服務名稱,第二個是來源,第三個則是執行的工作,其中spawn的意思是執行一個shell 命令。 %c %d 則是hosts.allow 裏的關鍵字,除了%c %d 以外還有很多可以試,請自行 man hosts.allow 來看。
%c 指的是連線進來的電腦的電腦名稱或ip。
%d 是指透過啥服務進來。 (不過前面寫了sshd,後面當然一定會是sshd,不過如果前面是ALL,那就有用啦。)
第二個問題的答案就太美妙啦,感謝vixual的無私貢獻以又酷學園裏的大大提出bug 修正,所以就有現成可以用的程式啦,是用perl寫的,其實概念不是太難。程式內容如下,把它存成 block_ssh.pl,所有者為root,存放位置隨便,當然啦,hosts.allow裏的spawn要隨之更改,這裏是放在 /root/bin/裏面,並且讓它以有可以執行的權限。
改為
PermitRootLogin no
之後重新啟動ssh。
再來是當每次有人用ssh連線時,啟動電腦來執行一個程式,這個程式會檢查/var/log/messages 的檔案,用連線進來的ip及 Faile password為關鍵字進行篩選,如果在一個小時內有錯過10次的連線的話,就叫防火牆把它的ip檔住,不再讓它連啦。
上面的文字包含二個重點,一個是如何在有使用者用ssh連線時去執行某程式;另一個是如何檢查log檔,看該使用者是否有try超過10次錯誤。
第一個問題的答案在/etc/hosts.allow 這個檔案裏有解。
在這個檔案裏加一行
sshd : ALL : spawn (/root/bin/block_ssh.pl %c %d)
第一個是服務名稱,第二個是來源,第三個則是執行的工作,其中spawn的意思是執行一個shell 命令。 %c %d 則是hosts.allow 裏的關鍵字,除了%c %d 以外還有很多可以試,請自行 man hosts.allow 來看。
%c 指的是連線進來的電腦的電腦名稱或ip。
%d 是指透過啥服務進來。 (不過前面寫了sshd,後面當然一定會是sshd,不過如果前面是ALL,那就有用啦。)
第二個問題的答案就太美妙啦,感謝vixual的無私貢獻以又酷學園裏的大大提出bug 修正,所以就有現成可以用的程式啦,是用perl寫的,其實概念不是太難。程式內容如下,把它存成 block_ssh.pl,所有者為root,存放位置隨便,當然啦,hosts.allow裏的spawn要隨之更改,這裏是放在 /root/bin/裏面,並且讓它以有可以執行的權限。
#!/usr/bin/perl # 及時封鎖使用 "暴入法" 入侵的使用者(SSH) # 技術支援: http://www.vixual.net/ # 原著者是 vixual (應該是吧!) # chmod 755 block_ssh.pl # 編輯 /etc/hosts.allow,加入 # sshd : ALL : spawn (/root/bin/block_ssh.pl %c %d) # 這樣就完成了,如有必要,請自行修改 block_ssh.pl 裡相關的參數。 # 以上取自原作者的網站 # ==相關參數== #記錄 ssh 連線的 LOG 檔,預設: /var/log/secure $log_file = "/var/log/secure"; #於多久的時間內嘗試登入(秒),預設: 1 小小時 $time_range = 1 * 60 * 60; #於 $time_range 所設定的時間內,嘗試登入失敗多少次立即封鎖 IP,預設: 10 次 $drop_count = 10; #寄件通知,預設收件者: root@localhost $mail = 'cmd@www.lapom.no-ip.org'; #寄件程式的位置 $sendmail = "/usr/sbin/sendmail"; #==== use Time::Local; $ip = $ARGV[0]; $daemon = $ARGV[1]; $count = 0; $ip =~ s/::ffff://; %month = ( Jan => 0, Feb => 1, Mar => 2, Apr => 3, May => 4, Jun => 5, Jul => 6, Aug => 7, Sep => 8, Oct => 9, Nov => 10, Dec => 11 ); $time = time(); ($second,$minute,$hour,$day,$month,$year) = localtime($time); #取得登入失敗的 logg @list = `cat $log_file | grep "sshd.*Failed password.*$ip "`; for(my $i = $#list; $i >= 0; $i--){ #取得 log 的時間 my($log_month,$log_day,$log_time) = split(/ +/,$list[$i]); my($log_hour,$log_minute,$log_second) = split(/:/,$log_time); #前一年的記錄 if($log_month > $month){ $log_year = $year - 1; }else{ $log_year = $year; } #將時間轉為秒數 $log_time = timelocal($log_second,$log_minute,$log_hour,$log_day,$month{$log_month},$log_year); if($time < $log_time + $time_range ){ $count++; }else{ last; } } if($count > $drop_count){ #封鎖 IP `iptables -I INPUT -p tcp -s $ip --dport 22 -j DROP`; if($mail){ #寄件通知 $hostname = `hostname`; $month++; $year += 1900; chomp($hostname); open(MAIL, "| $sendmail -t") || die "Can't open $sendmail !\n"; print MAIL qq|To: $mail\n|; print MAIL qq|Subject: [$hostname]封鎖 $ip\n|; print MAIL qq|Content-Transfer-Encoding: 8bit\n|; print MAIL qq|Content-type: text/plain\; charset=Big5\n\n|; print MAIL "\n時間: $year-$month-$day $hour:$minute:$second\n----\n使用者 \"$ip\" 嘗試以 SSH 登入伺服器,共失敗 $count 次,已於防火牆封鎖該 IP。\n\n"; print MAIL @list; close(MAIL); } } exit;
懶人ssh 站台列表
因為工作的需要…常常要ssh到不同的電腦去跑CASE,如果用X介面的SSH client軟體,通常都可以弄一些站台列表。然後只要點選就可以,方便的很,可是如果是透過終端介面去連,都每都要下指令,非常的煩人。下面的script範例,可以把常連的機器放進去一個script中,以後只要執行它,就可以連到你想連的地方去啦,當然,我的功力普普,所以一定有可以改進的地方,就這樣啦,夠用就好。
把下面的文字存成lazssh.bash,當然,常用的電腦IP要改,最後增加可以執行的權限即可。以後只要執行它,就可以連到你想去的地方啦 。
把下面的文字存成lazssh.bash,當然,常用的電腦IP要改,最後增加可以執行的權限即可。以後只要執行它,就可以連到你想去的地方啦 。
#****************************** #ssh client menu script by CMD # 2010.02.25 #****************************** # specify PC's IP address here # 把常用的電腦IP加在這裏 PC[1]="192.168.69.247" PC[2]="192.168.69..243" PC[3]="192.168.69..122" PC[4]="192.168.69..141" #*********************************** # do not need to be changed from here REPEAT_LOOP=1 while [ "$REPEAT_LOOP" = 1 ]; do clear echo " Lazy ssh....." I=0 for Spc in "${PC[@]}";do I=`expr $I + 1` echo " $I. ssh to $Spc." done I=0 for Spc in "${PC[@]}";do I=`expr $I + 1` echo " X$I. ssh -X to $Spc." done echo " X|x. EXIT." echo " " echo -n "Please type a selection: " read usr_choice &> /dev/null if (( $usr_choice > 0 && $usr_choice <= $I )) ; then echo "ssh ${PC[$usr_choice]}..." ssh ${PC[$usr_choice]} elif ([ $usr_choice = "X" ] || [ $usr_choice = "x" ]) ; then echo "Exiting ......" exit else tmp=`echo "$usr_choice" | sed s/X// | sed s/x// ` if (( $tmp > 0 && $tmp <= $I )) ; then echo "ssh -X ${PC[$tmp]}..." ssh -X ${PC[$tmp]} else echo "Invalid Choice. Please try again." REPEAT_LOOP=1 fi fi done
殘念~ ulimit -s unlimited 無法執行
一直以來,我改過的POM<--好啦我的功力差啦,因為用太多的allocate陣<--其實是全部的陣列都用allocate。所以執行時會有stack太小的問題啦。詳情與解法過程寫過了,就不再寫。總之就是用下面的指令:
ulimit -s unlimited
一直以來都沒問題,今天確出現下面的訊息…
-bash: ulimit: stack size: cannot modify limit: Operation not permitted
搞了半天,就是不給啦,大概就是你不是系統管理員,不給你改,(奇怪了,之前就沒這個問題,裝系統時也沒啥特別設定,不過我用的系統是CentOS4以後啦,現在這台是RHEL3)找了老半,總之要改下面這個檔案:
/etc/security/limits.conf 加一行: * hard stack unlimited
再重新登出/入就可以執行下面的指令了。
ulimit -s unlimited
至於為什麼……就懶得知道了。
ulimit -s unlimited
至於為什麼……就懶得知道了。
把 shell 變數傳進 awk 程式當中
在寫shell scripts,gawk很常用吧…例如印file 的第一、二、五、六行
gawk '{print $1, $2, $5, $6}' file
如果想把第五,六行乘一個放大係數(如:10倍)
gawk '{print $1, $2, $5*10, $6*10}' file
上面這樣寫當然沒問題。但是為了方便,放大係數通常放到變數裏(就叫做SCALE好了)
SCALE=10 gawk '{print $1, $2, $5*$SCALE, $6*$SCALE}' file
這樣就不行了…因為gawk自已也有變數,BASH也有變數,誰是誰要先弄清楚才行。
gawk變數設定方法是在' ' 的後面 與 輸入資料檔的前面(如果有的話) 設定。
改成如下:
SCALE=10 gawk '{print $1, $2, $5*sca, $6*sca}' sca=$SCALE file
注意,在gawk裏的變數是不用加"$"字符的。
有了這個,還可以對第n欄做累加。
gawk 'sum=sum+$1 {print $1, sum}' sca=$SCALE file
上面的指令會輸出file檔案裏的第一柵,以及第一欄的加總。
gawk 'sum=sum+$1; ss=ss+$2 {print $1, sum, $2, ss}' sca=$SCALE file
上面的指令會輸出file檔案裏的第一欄、第一欄的加總、第二欄與第二欄的加總。
訂閱:
文章 (Atom)