1. 程式人生 > >批量scp指令碼——從多臺機器拷貝相同檔案

批量scp指令碼——從多臺機器拷貝相同檔案

為了方便的從多臺伺服器獲取日誌(不同機器的相同日誌),寫了個簡易指令碼專門用於批量拷貝伺服器日誌到執行指令碼的機器中。該指令碼包含2個檔案bscp.sh和bscp.exp。

使用方式:

sh bscp.sh <username> <host1,host2> <log_file>
username:你ssh到目標機器的密碼。
host1,host2:目標機器的ip或者機器名,多個之間用逗號分割。
log_file:你要批量下載的日誌的絕對路徑。

執行後,程式提示輸入目標機器的密碼(這裡需要多臺機器的ssh使用者名稱密碼是相同的,且之前需要建立過ssh連線,就是不需要再進行yes/no互動)

bscp.sh主程式:

  1. #!/bin/bash  
  2. if [ $# != 3 ]    ;then  
  3.     echo "usage:<username> <host1,host2> <log_file>"  
  4.     exit 1  
  5. fi  
  6. stty -echo               #隱藏密碼輸出  
  7. read -p "Please enter target hosts' passwd of $1:" passwd  
  8. stty echo  
  9. echo  
  10. dirpath=`dirname $0`  
  11. #echo $dirpath  
  12. $dirpath/bscp.exp $1 $2 $3 $passwd  
expect指令碼:
  1. #!/usr/bin/expect -f  
  2. set user [lindex $argv 0]  
  3. set hosts [lindex $argv 1]  
  4. set logfile [lindex $argv 2]  
  5. set passwd [lindex $argv 3]  
  6. set timeout 10  
  7. set hostlist [split $hosts ","]             # 把host字串分割成列表  
  8. set slashIdx [expr [string last / $logfile] + 1]   
  9. set filename [string range $logfile $slashIdx end]  # 獲取日誌檔名  
  10. foreach h $hostlist {  
  11.     set hostfile $filename  
  12.     spawn scp [email protected]$h:$logfile ./$filename.$h  
  13.     expect "*Enter passphrase for key*" {   # 這裡可以改成其他可能出現的顯示文字,如password:等.或者加多yes/no的互動環節  
  14.         send  "$passwd\r"  
  15.         send  "\r"  
  16.     }  
  17.     expect "*%*" {set timeout -1 ; puts "\rtrasmitting..."}  
  18.     expect eof {                            # 下載完成後輸出成功資訊  
  19.         puts "\rtransmit successfully!"  
  20.         set timeout 10  
  21.     }  
  22. }  

一個栗子:

執行獲取3臺機日誌:
./bscp.sh ultrani host1,host2,host3 /home/admin/xxx/logs/access.log

結果是把3臺機器的日誌下載到執行指令碼的目錄中

日誌字尾以機器名結尾:
access.log.host1
access.log.host2
access.log.host3