expect是基于tcl语言,实现了用户通过ssh远程登陆设备,可实现无交互自动登陆的相关软软件,其中关于在使用expect的脚本应用中使用能过是管理员通过该命令对与管理大量设备进行维护具有很好的应用价值,接下来将对我最近使用的关于expect的应用进行介绍。以及在应用过程中出现的问题进行总结:

expect在使用中出现的关键词:

expect:

    1、spawn:该命令是进入expect环境后才能执行的内部命令,不能单独应用于shell环境。

    2、expect:这里是指expect的内部命令,主要功能是判断输出结果是否包含某项字符串,没有立即返回,否则就等待一段时间后返回,其中等待时间通过timeout进行设置

    3、send:执行交互动作,将交互要执行的动作进行输入给交互指令,同时命令字符串结尾要接上“\n”。

    4、interact:执行完后保持交互状态,将控制权交给控制台,否则将会自动退出

    5、expect eof:expect结束标志。

    6、$argv:expect脚本可以结束从bash传递过来的参数[lindex $argv n],n从0开时

    7、set timeout设置等待时间。默认单位为s,其中当设置为-1的时候表示永不超时。

    8、exp_continue:表示继续执行接下来的交互动作。

在使用expect的时候,首先工作就是要确定linux服务器中安装有expect软件:

1
2
3
[root@node1 xuexi] # rpm -qa | grep expect   //查询liux服务器中是否已经安装expect该软件包
expect-5.44.1.15-5.el6_4.x86_64
[root@node1 xuexi] #yum -y install expect     //如果没有安装则可以通过yum对其进行安装

脚本实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/expect
set  iptables [lindex $argv 0]
set  passwd  "123456"
set  timeout 30
spawn  ssh  root@$iptables
expect {
"yes/no"  { send  "yes\n" ;exp_continue}
"password:"  { send  "$passwd\n" }
}
expect  "]#"
send  "df -h;top -n 2\n"
expect eof
exit

创建地址列表touch list.txt

通过for循环语句对其list.txt所包含的设备进行读取

1
[root@node1 xuexi] # for i in $(cat list.txt);do ./v4.sh $i;done

运行过程中出现如下提示:

Permission denied, please try again.

应首先确认要登陆的linux服务器是否已经安装expect软件包,第二查看脚本中是否含有exp_continue的标志。

如果设备第一次登陆如果脚本中不含有exp_continue则会在输入密码的时候出现上述提示信息。