分發系統--expect

本文索引:php

  • 分發系統介紹
  • expect腳本遠程登陸
  • expect腳本遠程執行命令
  • expect腳本傳遞參數

分發系統介紹

場景介紹:企業中隨之業務的逐漸增大,後端所使用的編程語言是php,系統爲LAMP/LNMP架構,須要將代碼上傳到服務器中;代碼會不斷的迭代,這就須要在業務服務器上更新代碼,一臺一臺地手動迭代很不現實,這就須要創建一個分發系統,將代碼自動分發到各個服務器上,實現自動化更新!shell

所謂的分發系統,其實是一種腳本語言,經過expect程序實現。編程

這個分發系統首先要準備一臺模板機,更新好代碼,同時須要知道推送的多臺服務器的用戶及密碼,最後經過編寫expect腳本,藉助於rsync,登陸到各個服務器,並將代碼推送過去。該方法一樣支持命令的分發!後端


expect腳本遠程登陸

安裝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


expect腳本遠程執行命令

#!/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"

expect腳本傳遞參數

#!/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有一個超時時間,超出後會自動退出,後續命令不會繼續執行!

相關文章
相關標籤/搜索