在公司裏,產品服務代碼和配置文件會常常進行更新迭代,而線上服務器又不少的狀況下,就須要使用分發系統進行文件發佈更新。shell
咱們這裏使用上線腳本:expect腳本,他具備遠程登陸、批量發佈文件和批量遠程執行命令的功能服務器
yum install -y expect
通常狀況下,進行批量的機器上線或更新:先準備一臺模版機器(包含最新的代碼文件),準備50臺機器的ip地址列表和用戶密碼列表文件ssh
編寫expect腳本,實現自動遠程登陸:工具
#!/usr/bin/expect //使用expect工具執行腳本 set host "192.168.87.132" //設置變量 ip set passwd "123456" //設置密碼 spawn ssh@$host //遠程登陸 expect{ //與系統交互 "yes/no" {send "yes\r"; exp_continue } //檢測到關鍵字是,發送指令並回車 "password: " {send "$passwd\r"} //發送密碼回車 } interact //結束腳本,保持登陸遠程狀態
實現:遠程登陸後,執行命令,而後退出登陸spa
#!/usr/bin/expect set user "root" set passwd "123456" spawn ssh $user@192.168.87.132 expect { "yes/no" {send "yes\r"} "password: " {send "$passwd\r"} } expect "]*" //遇到shell命令輸入提示符,則發送指令,*號是通配,由於root用戶是#,普通用戶是$ send "touch /tmp/12.txt\r" //發送命令並回車執行 expect "]*" send "echo 1 2 n > /tmp/12.txt\r" expect "]*" send "exit\r" //退出遠程登陸狀態
若是腳本結尾,不加 interact 和 expect eof:則開始執行腳本登陸後,就會立刻退出登陸code
set timeout 100s //能夠設置保持登陸狀態時間爲100s,-1s爲不超時 expect eof //單單加這命令,執行完腳本後,退出登陸狀態。
$argv 0 1 2: 是expect腳本的第一、二、3個參數ip
#!/usr/bin/expect set user [lindex $argv 0] set host [lindex $argv 1] set passwd "123456" set cm [lindex $argv 2] spawn ssh $user@$host expect{ "yes/no" {send "yes\r"} "password: " {send "$passwd\r"} } expect "]*" send "$cm\r" ##執行腳本: ./cm.expect root 192.168.87.132 "ls;w;vmstat 1"