expect命令脚本语言应用
1、什么是Expect?
Expect是基于Tcl的相对简单的一个免费的脚本编程工具语言,用来实现自动和交互式任务程序进行通信,无需人的手工干预。
比如SSH、FTP等,这些程序正常情况都需要手工与它们进行交互,而使用Expect就可以模拟人手工交互的过程,实现自动的和
远端的程序交互,从而达到自动化运维的目的。
虽然,使用C、Perl等一样可以实现自动交互功能,然而Expect做的更专业出色、简单,而且除支持Unix/Linux平台外,它还支持
Windows平台,它就是为系统管理和软件测试方面的自动交互类需求而产生的。
2、Expect程序工作流程
Expect的工程可以理解为:spawn启动进程-->expect期待关键字->send向程序发送密码字符-->退出结束。
3、安装Expect软件及服务器环境说明
yum install expect -y
[root@model ~]# rpm -qa|grep expect
expect-5.44.1.15-5.el6_4.x86_64
192.168.0.253 centos6.6 server
192.168.0.252 centos6.6 client
192.168.0.251 centos6.6 client
4、Expect程序演示(可以看到ssh连接需要手动输入密码)
[root@model ~]# ssh -p52113 zxin10@192.168.0.252 /sbin/ifconfig eth0
The authenticity of host '[192.168.0.252]:52113 ([192.168.0.252]:52113)' can't be established.
RSA key fingerprint is da:23:0b:14:44:65:d8:5d:42:b9:ca:aa:30:78:07:64.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.0.252]:52113' (RSA) to the list of known hosts.
reverse mapping checking getaddrinfo for promote.cache-dns.local [192.168.0.252] failed - POSSIBLE BREAK-IN ATTEMPT!
zxin10@192.168.0.252's password:
eth0 Link encap:Ethernet HWaddr 00:0C:29:76:39:0E
inet addr:192.168.0.252 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe76:390e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:98 errors:0 dropped:0 overruns:0 frame:0
TX packets:88 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:14514 (14.1 KiB) TX bytes:13350 (13.0 KiB)
使用expect小程序实现自动交互。
[root@model ~]# mv expect_ssh.sh expect_ssh.exp
[root@model ~]# cat expect_ssh.exp
#!/bin/expect
spawn ssh -p52113 zxin10@192.168.0.253 /sbin/ifconfig eth0
set timeout 60
expect "*password:"
send "zxin10\n"
expect eof
exit
添加可执行权限
[root@model ~]# chmod 700 expect_ssh.exp
[root@model ~]# ll expect_ssh.exp
-rwx------ 1 root root 140 Jan 14 17:41 expect_ssh.exp
执行脚本发现无需交互直接实现执行命令
[root@model ~]# expect expect_ssh.exp
spawn ssh -p52113 zxin10@192.168.0.252 /sbin/ifconfig eth0
reverse mapping checking getaddrinfo for promote.cache-dns.local [192.168.0.252] failed - POSSIBLE BREAK-IN ATTEMPT!
zxin10@192.168.0.252's password:
eth0 Link encap:Ethernet HWaddr 00:0C:29:76:39:0E
inet addr:192.168.0.252 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe76:390e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:227 errors:0 dropped:0 overruns:0 frame:0
TX packets:140 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:28683 (28.0 KiB) TX bytes:18967 (18.5 KiB)
5、Expect语法
Expect中的命令是最重要的部分了,命令的使用语法如下:
命令 [选项] 参数
5.1 spawn
spawn命令是Expect的初始命令,用于启动一个进程,之后所有expect操作都在这个进程中进行,如果没有spawn语句,整个expect就无法执行了,
spawn使用方法如下:
spawn ssh -p52113 zxin10@192.168.0.252 /sbin/ifconfig eth0
5.2 expect
expect 表达式 动作 表达式 动作 。。。
expect命令用于等候一个相匹配的输出,一旦匹配上就执行expect后面的动作或命令,这个命令接受 几个特有参数,用的最多的就是re,表示使用
正则表达式的方式匹配,使用起来像这样:
expect "*password:"
send "zxin10\n"
expect eof
5.3 exp_send和send
exp_send和send几乎等价
5.4 exp_continue
这个命令一般用在动作中,expect连续匹配两个内容时需要使用exp_continue隔开。
看如下的例子:
[root@model ~]# cat expect_ssh2.exp
#!/usr/bin/expect
spawn ssh -p52113 zxin10@192.168.0.252 /sbin/ifconfig eth0
set timeout 60
expect {
-timeout 5
"yes/no" { exp_send "yes\r";exp_continue }
"*password:" { exp_send "zxin10\r" }
timeout { puts "TIMEOUT";return }
}
expect eof
exit
#执行结果如下:
[root@model ~]# expect expect_ssh2.exp
spawn ssh -p52113 zxin10@192.168.0.252 /sbin/ifconfig eth0
reverse mapping checking getaddrinfo for promote.cache-dns.local [192.168.0.252] failed - POSSIBLE BREAK-IN ATTEMPT!
zxin10@192.168.0.252's password:
eth0 Link encap:Ethernet HWaddr 00:0C:29:76:39:0E
inet addr:192.168.0.252 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe76:390e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:514 errors:0 dropped:0 overruns:0 frame:0
TX packets:262 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:60541 (59.1 KiB) TX bytes:30933 (30.2 KiB)
#你可以尝试删掉exp_continue测试一下。。。该程序不会继续执行。
5.5 send_user
send_user命令用来把后面的参数输出到标准输出中去。
6、Expect变量
expect中有很多有用的变量,它们的使用方法与TCL语言中的变量相同,比如:
set 变量名 变量值 #设置变量的方法
put $变量名 #读取变量的方法
7、Expect关键字
7.1 eof (end-of-file)
7.2 timeout 超时参数,timeout + puts返回超时提示。
1、什么是Expect?
Expect是基于Tcl的相对简单的一个免费的脚本编程工具语言,用来实现自动和交互式任务程序进行通信,无需人的手工干预。
比如SSH、FTP等,这些程序正常情况都需要手工与它们进行交互,而使用Expect就可以模拟人手工交互的过程,实现自动的和
远端的程序交互,从而达到自动化运维的目的。
虽然,使用C、Perl等一样可以实现自动交互功能,然而Expect做的更专业出色、简单,而且除支持Unix/Linux平台外,它还支持
Windows平台,它就是为系统管理和软件测试方面的自动交互类需求而产生的。
2、Expect程序工作流程
Expect的工程可以理解为:spawn启动进程-->expect期待关键字->send向程序发送密码字符-->退出结束。
3、安装Expect软件及服务器环境说明
yum install expect -y
[root@model ~]# rpm -qa|grep expect
expect-5.44.1.15-5.el6_4.x86_64
192.168.0.253 centos6.6 server
192.168.0.252 centos6.6 client
192.168.0.251 centos6.6 client
4、Expect程序演示(可以看到ssh连接需要手动输入密码)
[root@model ~]# ssh -p52113 zxin10@192.168.0.252 /sbin/ifconfig eth0
The authenticity of host '[192.168.0.252]:52113 ([192.168.0.252]:52113)' can't be established.
RSA key fingerprint is da:23:0b:14:44:65:d8:5d:42:b9:ca:aa:30:78:07:64.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.0.252]:52113' (RSA) to the list of known hosts.
reverse mapping checking getaddrinfo for promote.cache-dns.local [192.168.0.252] failed - POSSIBLE BREAK-IN ATTEMPT!
zxin10@192.168.0.252's password:
eth0 Link encap:Ethernet HWaddr 00:0C:29:76:39:0E
inet addr:192.168.0.252 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe76:390e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:98 errors:0 dropped:0 overruns:0 frame:0
TX packets:88 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:14514 (14.1 KiB) TX bytes:13350 (13.0 KiB)
使用expect小程序实现自动交互。
[root@model ~]# mv expect_ssh.sh expect_ssh.exp
[root@model ~]# cat expect_ssh.exp
#!/bin/expect
spawn ssh -p52113 zxin10@192.168.0.253 /sbin/ifconfig eth0
set timeout 60
expect "*password:"
send "zxin10\n"
expect eof
exit
添加可执行权限
[root@model ~]# chmod 700 expect_ssh.exp
[root@model ~]# ll expect_ssh.exp
-rwx------ 1 root root 140 Jan 14 17:41 expect_ssh.exp
执行脚本发现无需交互直接实现执行命令
[root@model ~]# expect expect_ssh.exp
spawn ssh -p52113 zxin10@192.168.0.252 /sbin/ifconfig eth0
reverse mapping checking getaddrinfo for promote.cache-dns.local [192.168.0.252] failed - POSSIBLE BREAK-IN ATTEMPT!
zxin10@192.168.0.252's password:
eth0 Link encap:Ethernet HWaddr 00:0C:29:76:39:0E
inet addr:192.168.0.252 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe76:390e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:227 errors:0 dropped:0 overruns:0 frame:0
TX packets:140 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:28683 (28.0 KiB) TX bytes:18967 (18.5 KiB)
5、Expect语法
Expect中的命令是最重要的部分了,命令的使用语法如下:
命令 [选项] 参数
5.1 spawn
spawn命令是Expect的初始命令,用于启动一个进程,之后所有expect操作都在这个进程中进行,如果没有spawn语句,整个expect就无法执行了,
spawn使用方法如下:
spawn ssh -p52113 zxin10@192.168.0.252 /sbin/ifconfig eth0
5.2 expect
expect 表达式 动作 表达式 动作 。。。
expect命令用于等候一个相匹配的输出,一旦匹配上就执行expect后面的动作或命令,这个命令接受 几个特有参数,用的最多的就是re,表示使用
正则表达式的方式匹配,使用起来像这样:
expect "*password:"
send "zxin10\n"
expect eof
5.3 exp_send和send
exp_send和send几乎等价
5.4 exp_continue
这个命令一般用在动作中,expect连续匹配两个内容时需要使用exp_continue隔开。
看如下的例子:
[root@model ~]# cat expect_ssh2.exp
#!/usr/bin/expect
spawn ssh -p52113 zxin10@192.168.0.252 /sbin/ifconfig eth0
set timeout 60
expect {
-timeout 5
"yes/no" { exp_send "yes\r";exp_continue }
"*password:" { exp_send "zxin10\r" }
timeout { puts "TIMEOUT";return }
}
expect eof
exit
#执行结果如下:
[root@model ~]# expect expect_ssh2.exp
spawn ssh -p52113 zxin10@192.168.0.252 /sbin/ifconfig eth0
reverse mapping checking getaddrinfo for promote.cache-dns.local [192.168.0.252] failed - POSSIBLE BREAK-IN ATTEMPT!
zxin10@192.168.0.252's password:
eth0 Link encap:Ethernet HWaddr 00:0C:29:76:39:0E
inet addr:192.168.0.252 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe76:390e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:514 errors:0 dropped:0 overruns:0 frame:0
TX packets:262 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:60541 (59.1 KiB) TX bytes:30933 (30.2 KiB)
#你可以尝试删掉exp_continue测试一下。。。该程序不会继续执行。
5.5 send_user
send_user命令用来把后面的参数输出到标准输出中去。
6、Expect变量
expect中有很多有用的变量,它们的使用方法与TCL语言中的变量相同,比如:
set 变量名 变量值 #设置变量的方法
put $变量名 #读取变量的方法
7、Expect关键字
7.1 eof (end-of-file)
7.2 timeout 超时参数,timeout + puts返回超时提示。