七十三、分发系统介绍、expect脚本远程登录
一、分发系统介绍
expect脚本:能传输文件,可以远程执行命令,不需要输入密码,上线代码。
首先,准备一台模板机器,这台机器上的代码是最新的代码,准备要上线的代码,要知道要线上机器的ip地址,还有对应用户和密码。
二、expect脚本远程登录
# yum install -y expect
自动远程登录
[root@MRX sbin]# vim 1.expect 路径:/usr/local/sbin/
#! /usr/bin/expect
set host "192.168.93.131"
set passwd "1346" #这两个是定义变量,在expect中要加一个set。
spawn ssh root@$host #expect命令有用到spawn,spawn后跟的就是系统的shell命令
expect {
"yes/no" { send "yes\r"; exp_continue} #初次登录时,发送yes,\r表示回车,exp_continue表示继续。
"password:" { send "$passwd\r" } #这句和上面的一句,是截取系统内的提示,和系统交互:当系统输出yes/no时我们怎么做,当输出password时我们怎么做。
}
interact #表示需要停留在远程的机器上,不需要退出来。不加它会直接退出来。如果加上expect eof,会在远程机器上停留一两秒钟然后退出来。
之前的make password安装的包其实就是expect包。
/root/.ssh/known_hosts 登录时,一个陌生机器登录会提示是否建立连接,点击确认保存后,信息会保存在这个文件内,清空这个文件的内容,再次登录就会再次出现是否建立连接的提示。
[root@MRX sbin]# chmod a+x ./1.expect
[root@MRX sbin]# ./1.expect //执行这个脚本
spawn ssh [email protected]
The authenticity of host '192.168.93.131 (192.168.93.131)' can't be established.
ECDSA key fingerprint is SHA256:Z7xp3qHrdUE3yl4C34LCIrYyaCTvwC/hhZsWu1iZfS4.
ECDSA key fingerprint is MD5:ff:06:a8:bd:b0:d9:2f:72:df:64:07:b2:b0:36:c4:06.
Are you sure you want to continue connecting (yes/no)? yes 自动回复了
Warning: Permanently added '192.168.93.131' (ECDSA) to the list of known hosts.
[email protected]'s password: 输入密码
Permission denied, please try again.
[email protected]'s password:
Last failed login: Sat Jul 28 22:35:09 CST 2018 from 192.168.93.130 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Sat Jul 28 22:08:46 2018 from 192.168.93.1
[root@CLAY ~]# //从主机名可以看出已经登录到另外一台机器上了
执行exit或者ctrl+d可以退出来。
三、expect脚本远程执行命令
自动远程登录后,执行命令并退出
[root@MRX sbin]# vim 2.expect 路径:/usr/local/sbin/
#!/usr/bin/expect
set user "root"
set passwd "1346"
spawn ssh [email protected]
expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
} #前面的内容和1.expect保持一致
expect "]*" #这里的]*是登录到新机器后所在路径的右边[root@CLAY ~]#,root用户后面是#,普通用户是$,所以用通配,不管是什么都执行下面的命令。
send "touch /tmp/12.txt\r" #touch 12.txt然后回车\r
expect "]*"
send "echo 1212 > /tmp/12.txt\r" #同理
expect "]*"
send "exit\r" #然后退出
[root@MRX sbin]# chmod a+x 2.expect //加x权限,不加就执行不了
四、expect脚本传递参数
传递参数
[root@MRX sbin]# vim 3.expect 路径:/usr/local/sbin/
#!/usr/bin/expect
set user [lindex $argv 0] #argv 0是第一个参数,把第一个参数的值赋给user
set host [lindex $argv 1] #argv 1是第二个参数,把第二个参数的值赋给host
set passwd "1346"
set cm [lindex $argv 2] #argv 2是第三个参数
spawn ssh $user@$host
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
set timeout -1 #比如要执行一个vmstat,如果想设置超时时间,就加这一行,永不超时就是-1,也可以指定秒数
expect "]*"
send "exit\r"
[root@MRX sbin]# chmod a+x 3.expect.
[root@MRX sbin]# ./3.expect root 192.168.93.129 ls
[root@MRX sbin]# ./3.expect root 192.168.93.129 "ls;w;vmstat 1"
可以执行一个或多个命令,如果想把多个命令作为一个参数传递进去,就要用双引号。