七十三, 分发系统介绍, 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 root@192.168.93.131
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.
root@192.168.93.131's password: 输入密码
Permission denied, please try again.
root@192.168.93.131'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 $user@192.168.93.129
- 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"
可以执行一个或多个命令, 如果想把多个命令作为一个参数传递进去, 就要用双引号.
来源: http://www.bubuko.com/infodetail-2708749.html