简介:
Expect 可以替系统管理员完成与系统的交互式操作
shell > yum -y install expect # 可以通过 yum 安装 shell > which expect # 路径 /usr/bin/expect
例一:
shell > cat login.exp #!/usr/bin/expect spawn ssh root@192.168.1.81; expect { "(yes/no)?" { send "yes "; exp_continue } "password:" { send "123456 "; exp_continue } "#" { send "uptime "; interact } }
## 使用 /usr/bin/expect 来解释脚本 , spawn 开启一个 ssh 进程 , expect 用来接收信息 , send 用来发送信息
"(yes/no)?" 当第一次登陆远程主机时会提示 yes/no , 匹配到信息时 send 发送 "yes
" ,
为换行 , exp_continue 为继续匹配下一条
"#" 由于是 root 用户登陆 , 那么匹配到正确的密码后会得到超级用户的标志 # 号 , 然后就可以 send 发送系统命令了 uptime
interact 指令意为:保持交互状态 , 将控制权交给控制台 , 也就是说刚登陆到远程主机 , 现在不会退出 , 且管理员可以操作主机
例二:
shell > cat login.exp #!/usr/bin/expect set timeout -1; spawn ssh root@192.168.1.81; expect { "(yes/no)?" { send "yes "; exp_continue } "password:" { send "123456 "; exp_continue } "#" { send "uptime exit "; expect eof } }
## set timeout -1 : 设置超时时间 , -1 为无穷大、可以指定例如 20 (单位为秒)
expect eof : 等待进程结束 (不保持交互状态), 当执行命令中没有明确指定退出登陆(exit
)时 , expect eof 会等到超时时间过后自
动退出远程系统(timeout 设为 -1 时 , 不会退出 ) , 如果明确指定 exit
(即上面例子)时 , 则执行完命令立即退出远程登陆系统
例三:
shell > 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 "; exp_continue } "password:" { send "$passwd "; exp_continue } "#" { send "uptime exit "; expect eof } } " }
## expect -c 从命令行执行 expect 脚本 现在可以实现循环登陆服务器执行命令后退出远程系统
将 exit
去掉 , 并且 expect eof 改为 interact 可以实现停留在远程服务器(只限一台服务器 , 如过多台的话第一台停留就不会循环了)
例四:
shell > 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 "; exp_continue } "password:" { send "$passwd "; exp_continue } "#" { send "uptime "; 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 )