20.27 分發系統介紹php
20.28 expect腳本遠程登陸linux
20.29 expect腳本遠程執行命令shell
20.30 expect腳本傳遞參數編程
20.27 分發系統介紹:vim
場景:業務愈來愈大。用的好比app,後端(也就是服務器)所使用的編程語言爲php。那要想運行這個php的代碼,就要搞一個LAMP或者LNMP的環境。最後還須要把大家的代碼上傳達到服務器上去(說白了就是作一個網站嘛)後端
可是在平時工做中業務不斷在迭代,有新的功能出現,那這時候就要去改代碼。幾臺機器的話還好,要是幾十臺的話,就要搞一個分發系統可以把天天或者每一段時間更新的代碼,分別的發佈到這幾十臺機器上去。bash
固然還會有開源的一些工具能夠幫咱們作到。可是這裏咱們要用shell編程可以實現的一種上線的工具。所謂的分發系統也就是上線的shell腳本。核心叫作expect,expect也能夠說是一種腳本語言(和shell很是像),咱們能夠用它可以實現傳輸文件,還能夠實現遠程執行命令,不須要咱們去輸入密碼。說着這可能會想到用ftp或xftp以及lrzsz上傳。之後會講到很是標準的上線的體系服務器
在這裏要準備一臺模板的機器,這臺機器的代碼是最新的代碼,是準備要上線的代碼。而後給要上線的這幾十臺機器的IP要知道,還有這幾十臺機器對應用戶的密碼。以後就是使用expect藉助rsync把這些代碼推送到這五十臺機器上去。計入須要執行一些命令,還能夠用expect登陸進去去執行這些命令。就是這樣的一個過程app
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ssh
20.28 expect腳本遠程登陸:
~1.yum install -y expect
~2.自動遠程登陸
#! /usr/bin/expect
set host "192.168.133.132" #定義host的變量。expect裏面定義變量的格式就是這樣寫的。注意前面要加set
set passwd "123456"
spawn ssh root@$host #登陸機器的語句
expect { #expect核心語句
"yes/no" { send "yes\r"; exp_continue} #至關於用戶交互。咱們初次登陸另外一臺機器的時候會提示一些。這個就是針對這些提示作出的判斷
"assword:" { send "$passwd\r" }
}
interact #結束。
最後結束語是interact:表示可是須要停留在遠程的機器上,不須要退出
最後結束語是expect eof:表示登陸後停留一兩秒後退出
若是什麼都不加: 登陸後立刻退出來
實例:
[root@axinlinux-01 ~]# cd /usr/local/sbin/
[root@axinlinux-01 sbin]# vim 1.expect
#! /usr/bin/expect
set host "192.168.208.130"
set passwd "wangxin789"
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"; exp_continue}
"assword:" { send "$passwd\r" }
}
interact
[root@axinlinux-01 sbin]# ./1.expect #這樣執行這個腳本
-bash: ./1.expect: 權限不夠
[root@axinlinux-01 sbin]# chmod a+x 1.expect #加上可執行的權限。不然會報權限不夠
[root@axinlinux-01 sbin]# ./1.expect #再次執行成功
如下,就是咱們腳本中,作出的一些判斷與交互。至關於以腳本的方式登陸了
spawn ssh root@192.168.208.130
The authenticity of host '192.168.208.130 (192.168.208.130)' can't be established.
ECDSA key fingerprint is SHA256:2YEHWSxuaj+NF8PI1ipI8BeYOqoajfpRICmS59xgQEw.
ECDSA key fingerprint is MD5:3e:75:16:b7:8e:40:10:0f:f3:e9:79:34:48:69:2a:e4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.208.130' (ECDSA) to the list of known hosts.
root@192.168.208.130's password:
Last login: Fri Sep 21 21:25:28 2018 from 192.168.208.1
[root@axinlinux-02 ~]# #成功登陸
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.29 expect腳本遠程執行命令:
~1.自動遠程登陸後,執行命令並退出
~2.#!/usr/bin/expect
set user "root"
set passwd "123456"
spawn ssh $user@192.168.133.132
expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect "]*" #就是咱們在輸入命令時前面的主機名[root@axinlinux-01]#,由於root的話是#,其餘用戶是$。因此這裏用了*,無論匹配的是哪一個
send "touch /tmp/12.txt\r"
expect "]*"
send "echo 1212 > /tmp/12.txt\r"
expect "]*"
send "exit\r" #最後的命令exit回車。天然腳本也就結束了
實例:
[root@axinlinux-01 sbin]# vim 2.expect
#!/usr/bin/expect
set user "root"
set passwd "123456"
spawn ssh $user@192.168.133.132
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@axinlinux-01 sbin]# chmod a+x 2.expect #同樣設置x權限
[root@axinlinux-01 sbin]# ./2.expect #運行它
spawn ssh root@192.168.208.130
root@192.168.208.130's password:
Last login: Fri Sep 21 21:49:27 2018 from 192.168.208.128
[root@axinlinux-02 ~]# touch /tmp/12.txt #能夠看到在02的機器上運行了腳本里的命令
[root@axinlinux-02 ~]# echo 1212 > /tmp/12.txt
[root@axinlinux-02 ~]# [root@axinlinux-01 sbin]# #最後又回到了01上
[root@axinlinux-02 ~]# cat /tmp/12.txt #檢查一下是否有
1212
[root@axinlinux-02 ~]# ls -l !$
ls -l /tmp/12.txt
-rw-r--r-- 1 root root 5 9月 21 22:04 /tmp/12.txt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.30 expect腳本傳遞參數:
傳遞參數(像shell有$1$2。也至關因而他的內置變量)。若是想執行多個命令,就傳遞多個參數
#!/usr/bin/expect
set user [lindex $argv 0] #這是他的第一個參數(把這個參數的值賦給user,也就是咱們登陸時要輸入的)。用方括號括起來的就是user。這也是他的格式
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"
實例:
[root@axinlinux-01 sbin]# vim 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"
[root@axinlinux-01 sbin]# ./3.expect root 192.168.208.130 ls #咱們輸入這三個參數。用戶名 目標IP 要執行的命令
spawn ssh root@192.168.208.130
root@192.168.208.130's password:
Last login: Fri Sep 21 22:22:39 2018 from 192.168.208.1
[root@axinlinux-02 ~]# ls #能夠看到進去後執行了這個命令
aaa.txt anaconda-ks.cfg shell zabbix-release-3.2-1.el7.noarch.rpm
[root@axinlinux-02 ~]# [root@axinlinux-01 sbin]#
[root@axinlinux-02 ~]# [root@axinlinux-01 sbin]# ./3.expect root 192.168.208.130 "ls;w;vmstat 1"
#以上,若是想進去執行多個命令,就傳遞多個參數,用分號間隔,而且用雙引號引發來(做爲一個參數傳遞)
spawn ssh root@192.168.208.130
root@192.168.208.130's password:
Last login: Fri Sep 21 22:26:20 2018 from 192.168.208.128
[root@axinlinux-02 ~]# ls;w;vmstat 1 #能夠看到咱們傳遞參數的三個命令
aaa.txt anaconda-ks.cfg shell zabbix-release-3.2-1.el7.noarch.rpm
22:28:52 up 1:05, 3 users, load average: 0.01, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 21:24 1:04m 0.05s 0.05s -bash
root pts/0 192.168.208.1 22:22 6:13 0.02s 0.02s -bash
root pts/1 192.168.208.128 22:28 0.00s 0.01s 0.00s w
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1113344 2076 189972 0 0 21 2 67 65 0 0 99 0 0
0 0 0 1113168 2076 190060 0 0 0 0 138 123 0 1 99 0 0
0 0 0 1113160 2076 190068 0 0 0 0 128 112 0 0 99 0 0
0 0 0 1113128 2076 190104 0 0 0 0 141 131 0 1 99 0 0
0 0 0 1113300 2076 190064 0 0 0 0 167 137 1 0 99 0 0
0 0 0 1113176 2076 190064 0 0 0 0 144 125 0 1 100 0 0
0 0 0 1113052 2076 190064 0 0 0 0 136 117 0 1 99 0 0
0 0 0 1113052 2076 190064 0 0 0 0 100 100 0 0 100 0 0
0 0 0 1113052 2076 190064 0 0 0 0 100 98 0 0 100 0 0
1 0 0 1113176 2076 190068 0 0 0 0 127 116 0 0 100 0 0
#由於vmstat不能自動中止,可是會有超時時間,因此會自動退出來
[root@axinlinux-01 sbin]#