批量scp指令碼——從多台機器拷貝檔案 為了方便的從多台伺服器擷取日誌,寫了個簡易指令碼專門用於批量拷貝伺服器日誌到執行指令碼的機器中。該指令碼包含2個檔案bscp.sh和bscp.exp。 使用方式: sh bscp.sh <username> <host1,host2> <log_file>username:你ssh到目標機器的密碼。host1,host2:目標機器的ip或者機器名,多個之間用逗號分割。log_file:你要批量下載的日誌的絕對路徑。 運行後,程式提示輸入目標機器的密碼(這裡需要多台機器的ssh使用者名稱密碼是相同的) bscp.sh主程式: [plain] #!/bin/bash if [ $# != 3 ] ;then echo "usage:<username> <host1,host2> <log_file>" exit 1 fi stty -echo #隱藏密碼輸出 read -p "Please enter target hosts' passwd of $1:" passwd stty echo echo dirpath=`dirname $0` #echo $dirpath $dirpath/bscp.exp $1 $2 $3 $passwd expect指令碼:[plain] #!/usr/bin/expect -f set user [lindex $argv 0] set hosts [lindex $argv 1] set logfile [lindex $argv 2] set passwd [lindex $argv 3] set timeout 10 set hostlist [split $hosts ","] # 把host字串分割成列表 set slashIdx [expr [string last / $logfile] + 1] set filename [string range $logfile $slashIdx end] # 擷取記錄檔名 foreach h $hostlist { set hostfile $filename spawn scp $user@$h:$logfile ./$filename.$h expect "*Enter passphrase for key*" { # 這裡可以改成其他可能出現的顯示文字,如password:等.或者加多互動環節 send "$passwd\r" send "\r" } expect "*%*" {set timeout -1 ; puts "\rtrasmitting..."} expect eof { # 下載完成後輸出成功資訊 puts "\rtransmit successfully!" set timeout 10 } } 一個栗子: 執行擷取3台機日誌:./bscp.sh ultrani host1,host2,host3 /home/admin/xxx/logs/access.log 結果是把3台機器的日誌下載到執行指令碼的目錄中 日誌尾碼以機器名結尾:access.log.host1access.log.host2access.log.host3