Linux指令碼連線遠端伺服器下載檔案
最近為了提高工作效率,想著把平時需要定期進行的程式碼替換工作進行自動化。於是寫了一個shell指令碼。整個指令碼的思路很簡單,就是把另一個環境上的最新編譯好的程式碼資料夾打包放到本地目錄,將新程式碼資料夾裡面的配置檔案替換成原本地配置檔案。程式碼如下:
!/bin/ksh Local_dir=$HOME/chouke_test #本地存放UMC資料夾目錄 Remote_dir=/orasvr_tmp/yssett # 編譯環境存放UMC目錄 today=`date +'%y%m%d'` #當天的日期 # log目錄及檔案 LOG_DIR=$HOME/chouke_log if [ -d $HOME/chouke_log ] #檢查日誌資料夾是否存在 then echo "日誌資料夾存在" else mkdir $HOME/chouke_log fi LOG_FILE=${LOG_DIR}/chouke_$(date +%Y%m%d).log #1.替換程式碼 cd ${Local_dir} #檢查UMC資料夾是否存在,並將其備份 if [ -d UMC ] then mv UMC UMC_bak_${today} echo "備份本地UMC資料夾!" else echo "本地UMC資料夾不存在,建立該資料夾!" mkdir UMC fi expect -c " #遠端登入到編譯環境,將UMC資料夾打包 set timeout 100; spawn ssh 使用者名稱@IP地址 -p 22 \"tar -cvf UMC_${today}.tar.gz UMC;\"; expect { *assword* { send \"密碼\r\" } } ; expect 使用者名稱@IP地址 { send exit\r } ; expect eof ; " ftp -n << ! open IP地址 user 使用者名稱 密碼 binary cd ${Remote_dir} prompt mget UMC_${today}.tar.gz # 下載最新UMC資料夾到本地 exit bye ! echo "解壓UMC壓縮包..." tar -xvf UMC_${today}.tar.gz && echo "解壓完成!" rm -f UMC_${today}.tar.gz expect -c " #遠端登入到編譯環境,將資料夾壓縮包刪除 set timeout 1; spawn ssh 使用者名稱@IP地址 -p 22 \"rm -f UMC_${today}.tar.gz;\"; expect { *assword* { send \"密碼\r\" } } ; expect 使用者名稱@IP地址 { send exit\r } ; expect eof ; " echo "編譯環境UMC資料夾壓縮包已刪除" cd ${Local_dir}/UMC/etc mv config.xml config.xml.${today} cp ${Local_dir}/UMC_bak_${today}/etc/config.xml ./ #將原來中的config.xml換到當前目錄中 echo "替換config.xml" cd ${Local_dir} chmod 755 -R UMC #給新資料夾下面的檔案賦予執行許可權 . .profile echo "程式碼抽殼完成!"
整個腳本里面比較關鍵的一點就是如何登入到遠端伺服器上面將其程式碼資料夾進行打包,然後下載下來。在指令碼中我用的是ssh命令實現自動登入遠端伺服器,使用expect命令實現在指令碼中自動輸入使用者名稱和密碼。
下面介紹一下expect命令:
Expect是一個用來實現自動互動功能的軟體套件,系統管理員可以使用它來實現對命令或程式提供輸入,而這些命令或程式是希望從終端(terminal)獲得輸入,通常是手工輸入。Expect通常有一系列expect-send對組成。expect等待輸出中輸出特定的字元,通常是一個提示符,比如本例中這個提示符就是“Password”;send傳送特定的響應,比如本例中傳送的就是遠端伺服器的登入密碼,而這個響應本來是應該由手動輸入的。
程式碼中:
1. [set timeout 100]是用來設定超時時間,表示等待上一步操作的響應的超時時間。值得注意的是,如果你的某一步操作需要比較長的時間,比如打包一個大檔案,最好把超時時間設定的長一些,免得操作到一半被終止。
2. [spawn ssh 使用者名稱@IP地址 -p 22 ]是用來expect的內部命令,主要作用是給ssh程序加個殼,用來傳遞互動指令。
3. [expect {*assword* { send \"密碼\r\" }} ;]這一條表示判斷上次的輸出結果裡是否包含“assword”字串,如果包含,則執行後面的互動動作。
4. [send \"密碼\r\" ]這裡是執行互動動作,等同意手動輸入密碼。
5. [expect eof]這個命令表示等待退出命令,一旦接收到標識子程序已經結束的eof字元,expect即退出。