一、expect简介
expect是LINUX系统中用来实现自动化控制和测试的软件工具,作为Tcl脚本语言的一个扩展应用在交互式软件中,如Telnet、FTP、SSH等。
执行shell脚本,需要从终端得到输入时(如ssh root@192.168.1.2),Expect可以根据提示,模拟标准输入来实现交互脚本执行,可以把shell和expect理解为两种不同的脚本语言,expect有独自的语法、变量。
二、expect用法 1、常用的命令:2、使用方法
- spawn:调用程序
- send:发送需要交互的命令;
- expecct:捕获相关内容;
- interact:保持交互状态,不会退出;
- expect eof:结束expect匹配;
- exp_continue:表示当前问题不存在时,继续回答下一个问题;
通过一个例子来说明各个参数的使用方法;
例一:A远程登录到B服务器上什么都不做;
代码实现:
#!/usr/bin/expect
# 开启一个程序
set timeout 5 设置超时时间
spawn ssh root@10.1.1.1
# 捕获相关内容
expect {
"(yes/no)?" { send "yesr";exp_continue }
"password:" { send "*******r" } // password 不同的操作系统,显示不一样,根据实际情况写
}
interact //交互,不会退出
expect eof // 结束expect,
expect中的变量用法
#!/usr/bin/expect
set IP 10.1.1.2 //定义变量IP
set PASS 123456 //定义变量PASS
set timeout 5 //超时时间
spawn ssh root@$IP
expect {
"yes/no" { send "yesr";exp_continue }
"password:" { send "$PASSr" }
}
interact
结合shell脚本使用
例二:shell脚本和expect结合使用,远程登陆到对台服务器上。
在大多数的生产环境中,对服务器都做了安全加固,通过sshuse用户登录,再切换到root用户,当然root用户一般不会给你使用,这里只是做个实验
#!/bin/env bash
#在这里使用whlie语句来实现循环控制
#新建一个ip_list文件,用来存放设备的ip和password,由于我的所有机器密码都是相同的,所以这里只存放IP地址
ip_list=/tmp/shell/ip_list
#
while read ip
do
/usr/bin/expect <<-END
set timeout 10
spawn ssh sshusr@$ip
expect "(yes/no)" { send "yesr";exp_continue }
expect "*assword:" { send "******r"}
expect "$"
send "su - rootr" //登录root用户
expect "(yes/no)" { send "yesr";exp_continue }
expect "*assword:" { send "*******r" }
expect "#" //捕获#
send "mkidr /tmp/ceshir" //发送相关的指令
expect eof //退出expect匹配;
END
done < $ip_list
可以通过send命令来完成想要实现的操作命令,非常的方便,提高工作效率;
3、总结expect在运维的工作中,使用起来还是很方便的,能够节省大量的时间和避免重复性劳动。想要学好expect使用方法,还需要多学习,深入了解。



