Expect 能够替系统管理员完成与系统的交互式操做 bash
[root@localhost ~]# yum -y install expect # 能够经过 yum 安装 服务器
[root@localhost ~]# which expect # 路径 ssh
/usr/bin/expect ide
[root@localhost tmp]# cat login.exp spa
#!/usr/bin/expect 命令行
spawn ssh root@192.168.1.81; orm
expect { xml
"(yes/no)?" { send "yes\r"; exp_continue } 进程
"password:" { send "123456\r"; exp_continue } it
"#" { send "uptime\r"; interact }
}
## 使用 /usr/bin/expect 来解释脚本 , spawn 开启一个 ssh 进程 , expect 用来接收信息 , send 用来发送信息
"(yes/no)?" 当第一次登录远程主机时会提示 yes/no , 匹配到信息时 send 发送 "yes\r" , \r 为换行 , exp_continue 为继续匹配下一条
"#" 因为是 root 用户登录 , 那么匹配到正确的密码后会获得超级用户的标志 # 号 , 而后就能够 send 发送系统命令了 uptime
interact 指令意为:保持交互状态 , 将控制权交给控制台 , 也就是说刚登录到远程主机 , 如今不会退出 , 且管理员能够操做主机
[root@localhost tmp]# cat login.exp
#!/usr/bin/expect
set timeout -1;
spawn ssh root@192.168.1.81;
expect {
"(yes/no)?" { send "yes\r"; exp_continue }
"password:" { send "123456\r"; exp_continue }
"#" { send "uptime\rexit\r"; expect eof }
}
## set timeout -1 : 设置超时时间 , -1 为无穷大、能够指定例如 20 (单位为秒)
expect eof : 等待进程结束 (不保持交互状态), 当执行命令中没有明确指定退出登录(exit\r)时 , expect eof 会等到超时时间事后自
动退出远程系统(timeout 设为 -1 时 , 不会退出 ) , 若是明确指定 exit\r (即上面例子)时 , 则执行完命令当即退出远程登录系统
[root@localhost tmp]# cat login.sh
#!/bin/bash
list=("192.168.1.81 root 123456" "192.168.1.82 root 123456" "192.168.1.83 root 123456")
length=${#list[@]}
for ((i=0;i<$length;i++))
{
host=`echo ${list[$i]} | awk '{print $1}'`
user=`echo ${list[$i]} | awk '{print $2}'`
passwd=`echo ${list[$i]} | awk '{print $3}'`
expect -c "
spawn ssh $user@$host;
expect {
\"(yes/no)?\" { send \"yes\r\"; exp_continue }
\"password:\" { send \"$passwd\r\"; exp_continue }
\"#\" { send \"uptime\rexit\r\"; expect eof }
}
"
}
## expect -c 从命令行执行 expect 脚本 如今能够实现循环登录服务器执行命令后退出远程系统
将 exit\r 去掉 , 而且 expect eof 改成 interact 能够实现停留在远程服务器(只限一台服务器 , 如过多台的话第一台停留就不会循环了)
[root@localhost tmp]# cat login.exp1
#!/usr/bin/expect
if { $argc != 3 } {
puts "usage $argv0 user host passwd"
exit 1
}
set user [lindex $argv 0]
set host [lindex $argv 1]
set passwd [lindex $argv 2]
spawn ssh $user@$host;
expect {
"(yes/no)?" { send "yes\r"; exp_continue }
"password:" { send "$passwd\r"; exp_continue }
"#" { send "uptime\r"; interact }
}
## $argc 表明参数个数 , $argv0 表明脚本名 , $argv 0 表明第一个参数 ...
若是传递参数不足 3 个 , 那么屏幕显示 usage 脚本名 user host passwd , 因此执行脚本时应: ./login.exp1 root 192.168.1.81 123456
参数不足 3 个则退出脚本
set 将第一个参数赋值给变量 user ...( 变量存储从 0 开始计算 1 2 3 ... n )