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

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

技術 shel 麻煩 新的 文件 有一個 很多 編輯 配置

分發系統介紹

大多數企業都會有這樣的需求,業務稍微大一點,它都會去做一些負載均衡,也意味著你的機器有多臺,至少得兩臺,兩臺的話,你的程序是分別放在了兩臺機器上或者是多臺機器上;假如說要添加一個新的功能,或者說你的程序有一個小bug,那這個時候你如果想這個bug修復,或者說新增一個功能的話,你要去改程序,那很多企業有svn,它是一個代碼管理倉庫,那我們如果把程序修改了之後呢,先傳一份到svn庫裏邊去;如果再智能自動化一點,我可以從咱們服務器上或者測試機上把svn庫裏的代碼直接拽過來,發布到咱們的測試機上,然後再從測試機上呢,測試完成之後沒問題了,我再把這些代碼呢再拉到咱們線上的服務器上。當然,有的公司沒有那麽復雜,它可能直接從svn庫裏面把代碼直接拉到咱們線上的服務器上,但是,你拉的時候呢,實際上只拉了一臺機器,假如說你負載均衡有三臺,那你這三臺其中一臺更新了,另外兩臺還沒有更新,那怎麽辦呢?那這個時候你得想辦法把代碼從這臺更新的機器上分發到另外兩臺機器上去,那分發的話,可以手動去拷貝,用rsycn;當然,也可以從svn裏邊直接拉過去,這個操作的話可能會復雜一點,一兩臺機器無所謂,但你機器多了的話,你每臺機器都得去操作一下,不好,效率比較低,所以我們想了一種辦法:就是在你這一臺測試機上或者是這一臺生產機器上,你去搞一個腳本,那這個腳本的目的呢,就是把這些新的代碼或者說所有的代碼同時給它同步到另外的機器上去,一鍵同步,那咱們這個腳本的目的呢就是為了同步;另外可能還有一種,我同步完成之後呢,我還要去在那臺機器上去執行一條命令,那比如我涉及到一個服務,我腳本或者說咱們這個apache、ngix配置文件我更新了,我更新了一臺測試沒問題了,那另外其他幾臺,我也要更新一下,那這個時候我更新的時候,我也是通過咱們這個腳本分發,直接分發給其他的機器,因為它們的腳本的配置都是一模一樣的,那你分發完成之後呢,是不是就意味著你的服務要重啟或者重新reload,怎麽辦?我就需要去在遠程的機器上去執行一些命令,那這個時候,我也需要同時去執行,批量執行,一臺一臺的登錄太麻煩了,很浪費時間,那我也可能通過這個腳本去實現,那今天要講的就是怎樣去實現程序或者配置文件的同步以及命令的遠程執行,那麽在這涉及到一個概念,叫做expect。

expect腳本遠程登錄

技術分享圖片

安裝expect

[root@100xuni1 ~]# yum install -y expect

安裝完成後寫expect的腳本,自動遠程登錄一臺機器,並執行命令

[root@100xuni1 sbin]# vim 1.expect
寫入一下內容:
#! /usr/bin/expect
set host "192.168.63.101"
set passwd "hanshuo"
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"; exp_continue}
"assword:" { send "$passwd\r" }
}
interact

技術分享圖片

加個執行權限

[root@100xuni1 sbin]# chmod a+x 1.expect

測試這個腳本

[root@100xuni1 sbin]# ./1.expect

技術分享圖片

expect腳本遠程執行命令

技術分享圖片

不僅僅遠程登錄,我還要執行一條命令,最後在退出來

[root@100xuni1 sbin]# vim 2.expect           ##編輯腳本
寫入下列內容:
#!/usr/bin/expect
set user "root"
set passwd "hanshuo"
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"

加個執行權限

[root@100xuni1 sbin]# chmod a+x 2.expect

測試這個腳本

[root@100xuni1 sbin]# ./2.expect

技術分享圖片

技術分享圖片

expect腳本傳遞參數

技術分享圖片

expect是可以傳遞參數的就像shell的$1$2一樣

[root@100xuni1 sbin]# vim 3.expect    ##編輯expect
寫入以下內容:
#!/usr/bin/expect

set user [lindex $argv 0]
set host [lindex $argv 1]
set passwd "hanshuo"
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"

技術分享圖片

加個執行權限

[root@100xuni1 sbin]# chmod a+x 3.expect

測試這個腳本

[root@100xuni1 sbin]# ./3.expect root 192.168.63.101 ls

技術分享圖片

技術分享圖片

技術分享圖片

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