本文索引:php
場景介紹:企業中隨之業務的逐漸增大,後端所使用的編程語言是php,系統爲LAMP/LNMP架構,須要將代碼上傳到服務器中;代碼會不斷的迭代,這就須要在業務服務器上更新代碼,一臺一臺地手動迭代很不現實,這就須要創建一個分發系統,將代碼自動分發到各個服務器上,實現自動化更新!shell
所謂的分發系統,其實是一種腳本語言,經過expect程序實現。編程
這個分發系統首先要準備一臺模板機,更新好代碼,同時須要知道推送的多臺服務器的用戶及密碼,最後經過編寫expect腳本,藉助於rsync,登陸到各個服務器,並將代碼推送過去。該方法一樣支持命令的分發!後端
安裝expect:yum install -y expect
服務器
寫expect腳本:實現自動遠程登陸另一臺機器並執行命令架構
[root@dr1 sbin]# cd /usr/local/sbin [root@dr1 sbin]# vi 1.expect set host "192.168.133.130" //指定變量 set passwd "1" spawn ssh root@$host //執行shell命令 // expect代碼塊用來執行交互 // send 發送指令 // \r 回車 // exp_continue 繼續執行 // interact 停留在遠程主機上,expect腳本還在運行 expect { "yes/no" { send "yes\r"; exp_continue} "password:" { send "$passwd\r" } } interact
expect代碼中的expect eof能夠在遠程主機上停留幾秒,不會立刻退出ssh
第一次遠程登陸主機,會提示輸入是否繼續,並輸入密碼,第二次登陸就直接提示password,不提示是否繼續了!編程語言
[root@test1 sbin]# ssh 192.168.65.130 The authenticity of host '192.168.65.130 (192.168.65.130)' can't be established. ECDSA key fingerprint is 42:50:a7:09:91:db:af:77:a5:3a:b3:67:1c:8a:5b:99. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.65.130' (ECDSA) to the list of known hosts. root@192.168.65.130's password: Last login: Tue Feb 27 20:50:13 2018 from 192.168.65.1 [root@test2 ~]# whoami
要想後續登陸也提示,清空/root/.ssh/know_hosts便可!spa
#!/usr/bin/expect set user "root" set passwd "1" spawn ssh $user@192.168.65.130 expect { "yes/no" { send "yes\r"; exp_continue} "password:" { send "$passwd\r" } } // 對應進入遠程主機後的[root@test2 ~]#最後的]# // 對於普通用戶而言,最後爲]$,使用]*都匹配到 expect "]*" send "touch /tmp/12.txt\r" expect "]*" send "echo 1212 > /tmp/12.txt\r" expect "]*" send "exit\r"
#!/usr/bin/expect set user [lindex $argv 0] //相似於shell內的$1 set host [lindex $argv 1] //相似於shell內的$2 set passwd "1" set cm [lindex $argv 2] //相似於shell內的$3,這裏指的是後續執行的命令 spawn ssh $user@$host expect { "yes/no" { send "yes\r"} "password:" { send "$passwd\r" } } expect "]*" send "$cm\r" expect "]*" send "exit\r"
使用時就須要指定參數code
# $3能夠是多條命令,使用;間隔,「」包裹 ./3.expect root 192.168.65.129 「ls;free -h」
expect有一個超時時間,超出後會自動退出,後續命令不會繼續執行!