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

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]#

相關文章
相關標籤/搜索