七十三、分發系統介紹、expect腳本遠程登錄、expect腳本遠程執行命令、expect傳遞參數
一、分發系統介紹
expect腳本:能傳輸文件,可以遠程執行命令,不需要輸入密碼,上線代碼。
首先,準備一臺模板機器,這臺機器上的代碼是最新的代碼,準備要上線的代碼,要知道要線上機器的ip地址,還有對應用戶和密碼。
二、expect腳本遠程登錄
# yum install -y expect
自動遠程登錄
[root@MRX sbin]# vim 1.expect 路徑:/usr/local/sbin/
#! /usr/bin/expect
set host "192.168.93.131"
set passwd "1346" #這兩個是定義變量,在expect中要加一個set。
spawn ssh root@$host #expect命令有用到spawn,spawn後跟的就是系統的shell命令
expect {
"yes/no" { send "yes\r"; exp_continue} #初次登錄時,發送yes,\r表示回車,exp_continue表示繼續。
"password:" { send "$passwd\r" } #這句和上面的一句,是截取系統內的提示,和系統交互:當系統輸出yes/no時我們怎麽做,當輸出password時我們怎麽做。
}
interact #表示需要停留在遠程的機器上,不需要退出來。不加它會直接退出來。如果加上expect eof,會在遠程機器上停留一兩秒鐘然後退出來。
之前的make password安裝的包其實就是expect包。
/root/.ssh/known_hosts 登錄時,一個陌生機器登錄會提示是否建立連接,點擊確認保存後,信息會保存在這個文件內,清空這個文件的內容,再次登錄就會再次出現是否建立連接的提示。
[root@MRX sbin]# chmod a+x ./1.expect
[root@MRX sbin]# ./1.expect //執行這個腳本
spawn ssh [email protected]
The authenticity of host '192.168.93.131 (192.168.93.131)' can't be established.
ECDSA key fingerprint is SHA256:Z7xp3qHrdUE3yl4C34LCIrYyaCTvwC/hhZsWu1iZfS4.
ECDSA key fingerprint is MD5:ff:06:a8:bd:b0:d9:2f:72:df:64:07:b2:b0:36:c4:06.
Are you sure you want to continue connecting (yes/no)? yes 自動回復了
Warning: Permanently added '192.168.93.131' (ECDSA) to the list of known hosts.
[email protected]'s password: 輸入密碼
Permission denied, please try again.
[email protected]'s password:
Last failed login: Sat Jul 28 22:35:09 CST 2018 from 192.168.93.130 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Sat Jul 28 22:08:46 2018 from 192.168.93.1
[root@CLAY ~]# //從主機名可以看出已經登錄到另外一臺機器上了
執行exit或者ctrl+d可以退出來。
三、expect腳本遠程執行命令
自動遠程登錄後,執行命令並退出
[root@MRX sbin]# vim 2.expect 路徑:/usr/local/sbin/
#!/usr/bin/expect
set user "root"
set passwd "1346"
spawn ssh [email protected]
expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
} #前面的內容和1.expect保持一致
expect "]*" #這裏的]*是登錄到新機器後所在路徑的右邊[root@CLAY ~]#,root用戶後面是#,普通用戶是$,所以用通配,不管是什麽都執行下面的命令。
send "touch /tmp/12.txt\r" #touch 12.txt然後回車\r
expect "]*"
send "echo 1212 > /tmp/12.txt\r" #同理
expect "]*"
send "exit\r" #然後退出
[root@MRX sbin]# chmod a+x 2.expect //加x權限,不加就執行不了
四、expect腳本傳遞參數
傳遞參數
[root@MRX sbin]# vim 3.expect 路徑:/usr/local/sbin/
#!/usr/bin/expect
set user [lindex $argv 0] #argv 0是第一個參數,把第一個參數的值賦給user
set host [lindex $argv 1] #argv 1是第二個參數,把第二個參數的值賦給host
set passwd "1346"
set cm [lindex $argv 2] #argv 2是第三個參數
spawn ssh $user@$host
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
set timeout -1 #比如要執行一個vmstat,如果想設置超時時間,就加這一行,永不超時就是-1,也可以指定秒數
expect "]*"
send "exit\r"
[root@MRX sbin]# chmod a+x 3.expect.
[root@MRX sbin]# ./3.expect root 192.168.93.129 ls
[root@MRX sbin]# ./3.expect root 192.168.93.129 "ls;w;vmstat 1"
可以執行一個或多個命令,如果想把多個命令作為一個參數傳遞進去,就要用雙引號。
七十三、分發系統介紹、expect腳本遠程登錄、expect腳本遠程執行命令、expect傳遞參數