1. 程式人生 > >分發系統介紹 expect腳本遠程登錄 expect腳本遠程執行命令 expect腳本傳遞參數

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

輸入 cto password 但是 tab cit echo 介紹 都是

一、分發系統介紹
技術分享圖片
場景:公司業務逐漸擴大,後端服務端使用的編程語言是PHP,要運行PHP的環境,需要配置LAMP或者LNMP環境,最後還需要把代碼上傳到服務器上去,但是業務在叠代,需要新增功能,一臺機器還好,可以在機器上直接修改,但是這樣做不規範,如果機器有幾十臺或者上百臺機器都是這一個站點的,比如有一個接口,APP訪問量很大,APP需要調用服務端的一個接口,假如這個接口有50臺機器在承載,這時候,就需要做一個分發系統,能夠把每天或者每一段時間更新的代碼分別發發布到這50臺機器上去,分發器其實就是上線的腳本,核心的東西叫做expect,expect也可以說是一種腳本語言,用它可以實現傳輸文件,還可以實現遠程執行命令,不需要我們輸入密碼

具體實現如下:
準備一臺模板的機器,這臺機器上的代碼是最新的代碼(準備要上線的代碼),給這50臺機器上線,這50臺機器的IP地址和對應賬號的密碼都要知道,使用expect腳本,借助於rsync把代碼推送到50臺機器上,加入需要執行一些命令,可以使用expect去登錄執行一些命令,這樣的一個過程。

二、expect腳本遠程登錄
[root@linux-01 sbin]# yum install -y expect //檢查系統有沒有安裝expect
安裝好之後就可以寫expect腳本了
實例1:
自動遠程登錄,並執行命令
[root@linux-01 sbin]# vi 1.expect
#! /usr/bin/expect

set host "192.168.238.130" //遠程連接130這臺機器
set passwd "123456"
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"; exp_continue} //提示yes/no的時候說明/root/.ssh/known_hosts
"password:" { send "$passwd\r" }
}
interact

//解釋:"yes/no" { send "yes\r"; exp_continue} //提示yes/no的時候說明/root/.ssh/known_hosts文件裏面沒有連接這臺機器的記錄,是一臺陌生的機器,會提示你是否繼續連接,send "yes\r"初次登錄給它發送yes,\r表示回車,exp_continue表示繼續;

interact表示繼續停留在遠程的機器上;
interact這裏也可以寫 expect eof 表示登錄到遠程的機器上之後停留1-2秒退出遠程機器

[root@linux-01 sbin]# chmod a+x 1.expect //給1.expect 執行權限
[root@linux-01 sbin]# ./1.expect //執行下腳本看是否可以連接到130這臺機器上
spawn ssh [email protected]
The authenticity of host ‘192.168.238.130 (192.168.238.130)‘ can‘t be established.
ECDSA key fingerprint is SHA256:XAsiANqeZBXKHHPOs2F7CVv4z0mcZ9i99JROujGXbl4.
ECDSA key fingerprint is MD5:2f:28:55:22:14:2b:51:c3:8f:86:d1:e8:0f:cc:51:03.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.238.130‘ (ECDSA) to the list of known hosts.
[email protected]‘s password:
Last login: Wed Jul 11 21:21:01 2018 from 192.168.238.1
[root@linux-02 ~]# //證明是可以成功的登錄到130機器上

三、expect腳本遠程執行命令
技術分享圖片
實例2:
自動遠程登錄後,執行命令並退出
[root@linux-01 sbin]# vi 2.expect
#!/usr/bin/expect
set user "root"
set passwd "123456"
spawn ssh [email protected]

expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect "]"
send "touch /tmp/12.txt\r"
expect "]
"
send "echo 1212 > /tmp/12.txt\r"
expect "]*"
send "exit\r"

//解釋:
expect "]" 當判斷到是"]"時;
send "touch /tmp/12.txt\r" 創建一個12.txt文件;
expect "]" 接著運行命令;
send "echo 1212 > /tmp/12.txt\r" 把1212輸入到12.txt文件;
expect "]
"
send "exit\r" 運行exit命令退出去
[root@linux-01 sbin]# chmod a+x 2.expect //給腳本執行權限
[root@linux-01 sbin]# ./2.expect
spawn ssh [email protected]
[email protected]‘s password:
Last login: Sun Jul 22 20:47:28 2018 from 192.168.238.128
[root@linux-02 ~]# touch /tmp/12.txt
echo 1212 > /tmp/12.txt
[root@linux-02 ~]# echo 1212 > /tmp/12.txt
[root@linux-02 ~]# [root@linux-01 sbin]#
[root@linux-01 sbin]#

我們可以到130機器上去驗證下
[root@linux-01 sbin]# ./1.expect
spawn ssh [email protected]
[email protected]‘s password:
Last login: Sun Jul 22 22:07:41 2018 from 192.168.238.128
[root@linux-02 ~]# ls -l /tmp/12.txt
-rw-r--r-- 1 root root 5 Jul 22 22:07 /tmp/12.txt

四、expect腳本傳遞參數
技術分享圖片
實例3:
傳遞參數
[root@linux-01 sbin]# vi 3.expect
#!/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"
expect "]
"
send "exit\r"

//解釋:
set user [lindex $argv 0]中$argv 0是第一個參數,把第一個參數的值賦給user,;
set host [lindex $argv 1]中$argv 1是第二個參數;
set cm [lindex $argv 2]中$argv 2是第三個參數

[root@linux-01 sbin]# chmod a+x 3.expect //給腳本執行權限
[root@linux-01 sbin]# ./3.expect root 192.168.238.130 ls //給腳本傳遞user host cm三個參數
spawn ssh [email protected]
[email protected]‘s password:
Last login: Sun Jul 22 22:08:38 2018 from 192.168.238.128
[root@linux-02 ~]# ls
11.txt 123 2.txt anaconda-ks.cfg.1 zabbix-release-3.2-1.el7.noarch.rpm
[root@linux-02 ~]# [root@linux-01 sbin]#
[root@linux-01 sbin]# ./3.expect root 192.168.238.130 "ls;w;vmstat 1" //連續執行多個命令,expect一般默認遠程登錄時間是10秒鐘就退出來了

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