分发系统介绍、expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数

7月19日任务

20.27 分发系统介绍
20.28 expect脚本远程登录
20.29 expect脚本远程执行命令
20.30 expect脚本传递参数

 

20.27 分发系统介绍

公司业务逐渐扩大时,假如使用的网站或者APP的后端服务器所使用的语言是PHP,如果要想运行PHP代码,需要配置一个lamp或lnmp的环境,最后还需要把代码上传到服务器上去,但是在平常工作中经常有一些新的业务改变,这个时候就需要去修改代码,如果服务器不多还可以快速的在服务器上修改,但是如果有50台或更多服务器,那么就不可能直接在服务器进行修改了,这个时候就可以使用到分发系统这样的上线工具进行上线,发布上线代码,所谓的分发系统也就是上线的shell脚本,最核心的东西就是expect,expect也可以说是一种脚本语言,和shell很像,可以用它去实现传输文件,还可以实现自动远程登录执行命令,不需要输入密码。

使用什么工具上线代码,所谓上线就是把开发人员写的代码发布到线上环境去。

分发系统如何实现发布上线代码,首先要准备一台模板的机器,这台机器上的代码是最新的代码,是需要准备上线的代码,另外要给这50台电脑上线代码,还需要知道50台电脑的IP和对应的用户密码,然后使用expect脚本借助于rsync把这些代码推送到50台机器上,假如说还需要执行一些命令,还可以使用expect远程登录后去执行命令,就是这样的一个过程实现新代码上线发布。

 

20.28 expect脚本远程登录

1、yum安装expect 软件包

 

[root@jimmylinux-001 ~]# yum install -y expect

 

2、编写expect脚本

示例1:通过expect脚本自动远程登录,并执行命令。

[root@jimmylinux-001 sbin]# vi 1.expect

#! /usr/bin/expect
set host "192.168.52.129"  定义变量
set passwd "***@126.com"   定义变量
spawn ssh root@$host       登录机器的语句
expect {
"yes/no" { send "yes\r"; exp_continue}  初次登录一台机器会提示yes/no 对话框
"assword:" { send "$passwd\r" }
}
interact
[root@jimmylinux-001 sbin]# ssh 192.168.52.129  因为之前有登录过,所以不会提示yes/no 对话框
root@192.168.52.129's password: 

[root@jimmylinux-001 sbin]# vi /root /.ssh/known_hosts  清空文件里的内容,再次登录时候就会提示yes/no 

执行效果

[root@jimmylinux-001 sbin]# chmod a+x 1.expect

[root@jimmylinux-001 sbin]# ./1.expect
spawn ssh root@192.168.52.129

root@192.168.52.129's password: 
Last login: Thu Jul 19 17:19:52 2018 from 192.168.52.128

[root@jimmylinux-002 ~]#  已经自动登录到192.168.52.129 这台机器

 

20.29 expect脚本远程执行命令

示例2:通过expect脚本自动远程登录,并执行命令最后退出。

[root@jimmylinux-001 sbin]# vi 2.expect

#!/usr/bin/expect
set user "root"
set passwd "***@126.com"
spawn ssh $user@192.168.52.129

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@jimmylinux-001 sbin]# chmod a+x 2.expect

[root@jimmylinux-001 sbin]# ./2.expect
spawn ssh root@192.168.52.129

root@192.168.52.129's password: 
Last login: Thu Jul 19 22:45:22 2018 from 192.168.52.1

[root@jimmylinux-002 ~]# touch /tmp/12.txt

[root@jimmylinux-002 ~]# echo 1212 > /tmp/12.txt

[root@jimmylinux-002 ~]# [root@jimmylinux-001 sbin]#

[root@jimmylinux-001 sbin]# ./1.expect
spawn ssh root@192.168.52.129

root@192.168.52.129's password: 
Last login: Thu Jul 19 22:56:30 2018 from 192.168.52.128

[root@jimmylinux-002 ~]# ls -l /tmp/12.txt
-rw-r--r-- 1 root root 5 7月  19 22:56 /tmp/12.txt

[root@jimmylinux-002 ~]# cat !$
cat /tmp/12.txt
1212

比较1.expect和2.expect脚本的区别,1脚本仅仅是登录进去,然后interact表示expect脚本结束了,但是会停留在机器上不会退出登录的机器,2脚本登录完之后,还需要执行几条命令,最后才是退出结束脚本。

[root@jimmylinux-001 sbin]# cat 1.expect
#! /usr/bin/expect
set host "192.168.52.129"
set passwd "1982ya@163.com"
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"; exp_continue}
"assword:" { send "$passwd\r" }
}
interact
[root@jimmylinux-001 sbin]# cat 2.expect
#!/usr/bin/expect
set user "root"
set passwd "1982ya@163.com"
spawn ssh $user@192.168.52.129

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"

 

20.30 expect脚本传递参数

shell里面有$1 $2,expect也是可以传递参数的,也相当于是内置变量。

示例3:expect脚本传递参数

 1 [root@jimmylinux-001 sbin]# vi 3.expect
 2 
 3 #!/usr/bin/expect
 4 
 5 set user [lindex $argv 0]
 6 set host [lindex $argv 1]
 7 set passwd "***@126.com"
 8 set cm [lindex $argv 2]
 9 spawn ssh $user@$host
10 
11 expect {
12 "yes/no" { send "yes\r"}
13 "password:" { send "$passwd\r" }
14 }
15 expect "]*"
16 send "$cm\r"
17 expect "]*"
18 send "exit\r"

执行效果

 1 [root@jimmylinux-001 sbin]# vi 3.expect
 2 [root@jimmylinux-001 sbin]# chmod a+x 3.expect
 3 [root@jimmylinux-001 sbin]# ./3.expect root 192.168.52.129 "ls;w;vmstat 1"  传递多条命令,需要使用双引号引起来,中间用分号分隔。
 4 spawn ssh root@192.168.52.129
 5 root@192.168.52.129's password: 
 6 Last login: Thu Jul 19 22:58:35 2018 from 192.168.52.128
 7 [root@jimmylinux-002 ~]# ls;w;vmstat 1
 8 11     2.txt   anaconda-ks.cfg  cc.txt      sed
 9 1.cap  33.txt  awk              grep        test
10 1.txt  3.txt   b.txt            jimmylinux  zabbix-release-3.2-1.el7.noarch.rpm
11  23:17:46 up  1:28,  2 users,  load average: 0.00, 0.01, 0.05
12 USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
13 root     pts/0    192.168.52.1     22:45   32:24   0.02s  0.02s -bash
14 root     pts/1    192.168.52.128   23:17    0.00s  0.03s  0.00s w
15 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
16  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
17  1  0      0 1068428   2076 203668    0    0    17    19   68   71  0  0 99  0  0
18  0  0      0 1068380   2076 203808    0    0     0   302  187  199  0  0 97  3  0
19  0  0      0 1068380   2076 203808    0    0     0     0  140  136  0  0 100  0  0
20  0  0      0 1068380   2076 203808    0    0     0   110  198  189  1  1 99  0  0
21  0  0      0 1068380   2076 203808    0    0     0    11  188  181  0  0 100  1  0
22  0  0      0 1068412   2076 203808    0    0     0     6  163  158  0  1 100  0  0
23  0  0      0 1068412   2076 203808    0    0     0     6  191  181  0  0 100  0  0
24  0  0      0 1068256   2076 203848    0    0     0    58  194  171  0  1 99  0  0
25  0  0      0 1068132   2076 203848    0    0     0     6  168  163  0  1 100  0  0

 

posted @ 2018-07-19 17:46  吉米乐享驿站  阅读(991)  评论(0编辑  收藏  举报