小型自动化运维--expect入门知识
Expect的自动交互工作流程简单说明:
spawn启动指定进程-->expect获取期待的关键字-->send向指定进程发送指定字符-->进程执行完毕,退出脚本。
- spawn命令
如果没有spawn命令,expect程序将会无法实现自动交互。
spawn命令的语法为:
spawn [选项] [需要自动交互的命令或程序]
例如:spawn ssh [email protected] uptime
说明:在spawn命令的后面,直接加上要执行的命令或程序(如上例的ssh命令)等,除此之外,spawn还支持一些选项(了解即可!)
-open:表示启动文件进程;
-ignore:表示忽略某些信号;
- expect命令
expect命令的语法为:
expect 表达式 [动作]
例如:spawn ssh [email protected] uptime
expect "*password" {send "root\r"}
说明:上述命令不能直接在linux命令行中执行,需要放入expect脚本中进行。
- 根据上述两个命令,写一个简单的expect脚本
方法一:
#!/usr/bin/expect ##可以使用which expect查看
spawn ssh [email protected] uptime
expect "yes/no" {send "yes\n"}
expect "*password" {send "root\n"} ##\n表示换行,这里也可以使用\r表示回车
expect eof ##想要输出结果,必须加上eof(end of file),表示expect的结束
执行的结果如下:
方法二:
将expect与send不放在同一行,这样就不需要使用{}(大括号)了,上面的例子可以改成:
#!/usr/bin/expect
spawn ssh [email protected] uptime
expect "yes/no"
send "yes\n"
expect "*password"
send "root\n"
expect eof
执行的结果如上!
- exp_send、exp_continue与多行expect的用法举例
#!/usr/bin/expect
spawn ssh [email protected] uptime
expect {
# "yes/no" {exp_send "yes\r";exp_continue}
# "*password" {exp_send "root\n"}
"yes/no" {send "yes\r";exp_continue}
"*password" {send "root\n"}
}
expect eof
说明:(1)exp_send和send类似,后面的\r(回车),\n(换行);
(2)expect {},类似于多行expect;
(3)匹配多个字符串,需要在每次匹配并执行动作后,加上exp_continue。
- send_user命令,类似shell里的echo命令
#!/usr/bin/expect
send_user "My name is wtf.\n"
send_user "I am a linuxer,\t" ##制表符
send_user "My blog is www.wutengfei.blog.51cto.com\n"
执行的结果如下:
- exit命令
exit命令功能类似于shell中的exit,即直接退出Expect脚本,除了最基本的退出脚本功能之外,还可以利用这个命令对脚本做一些关闭前的清理和提示等工作,举例如下:
#!/usr/bin/expect
send_user "My name is wtf.\n"
send_user "I am a linuxer,\t"
send_user "My blog is www.wutengfei.blog.51cto.com\n"
exit -onexit {
send_user "Good bye.\n"
}
执行结果如下:
- expect程序变量
(1)普通变量
定义变量的基本语法如下:
set 变量名 变量值
如:set password "root"
打印变量的两种方法:
方法一:
puts $变量名
如:puts $password
方法二:
send_user "$password\n"
举例如下:
#!/usr/bin/expect
set password "root"
puts $password
send_user "$password\n"
执行结果如下:
(2)特殊变量
在Expect里也有与shell脚本里的$0、$1、$#等类似的特殊参数变量,用于接收及控制Expect脚本传参。在Expect中$argv表示参数数组,可以使用[lindex $argv n]接收Expect脚本传参,n从0开始,分别表示第一个[lindex $argv 0]参数,第二个[lindex $argv 1]参数。。。
说明:[lindex $argv 0]相当于shell中的$1,[lindex $argv 2]相当于shell中的$2;$argv0(相当于shell中$0)表示脚本的名字;$argc(相当于shell中$#)表示参数的总个数。
#!/usr/bin/expect
#define var
set file [lindex $argv 0]
set host [lindex $argv 1]
set dir [lindex $argv 2]
send_user "$file\t$host\t$dir\n"
puts "$file\t$host\t$dir\n"
puts $argv0
puts $argc
执行结果如下: