Linux之expect命令免交互实现
Posted temagenie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之expect命令免交互实现相关的知识,希望对你有一定的参考价值。
expect命令,是基于tcl的一门语言,其内在原理和早期的chat一样;
是用于实现用户和程序之间的交互自动化进行的工具。
一、expect语法构成:
expect可单独写一个脚本:
#!/usr/bin/expect -f
set timeout 5
spawn COMAND
expect PATTERN0 {
send "STRING0 "
exp_continue
}
expect {
PATTERN1 {
send "STRING1 "
exp_continue
}
PATTERN2 {
send "STRING2 "
exp_continue
}
}
expect "PATTERN3"
exp_send "STRING3 "
以上混用了三种不同的expect书写格式;
其中,PATTERN默认只支持glob通配规则(*和?等),只需-re PATTERN 即可支持扩展正则表达式匹配了。
注意:所有{ } 的前面都需要一个空格隔开;
二、子命令解释:
set 创建变量,[lindex $argv 0] 表示引用脚本参数中的第一个值;[lindex $argv 0-2] 表示引用脚本参数中第0到2个值。
set timeout # 设置等待交互执行结束的超时时间并继续执行下去,为 -1 永不超时;
send =exp_send 用于向进程发送字符串,支持换码符,
表示回车;
选项:
-i 指定spawn_id,针对不同spawn对象来发送信息;是进行多程序控制的关键参数
-s 表示slowly,控制发送速度,send -s 相当于 send_slow
send -s {10 .001} 表示每10个字符一传送,传送间隔为1毫秒
expect 从进程中接受字符串,类似触发器的启动;
expect包含的子命令:
exp_continue:表示继续执行expect流,并默认重置超时时钟;
-continue_timer 不重置超时时钟,继续计时,超时则忽略,不推荐;
exp_send : 是send的别名,完全相同的用法;(所有exp_command都是command的别名,完全等同)
spawn 启动新的子进程;每个spawn都有一个spawn_id
interact 保持交互状态,默认spawn启动子进程执行目标命令,并且控制权会在执行命令结束后交还给原来的进程(即用户可以输入了!),
通过interact帮助维持子进程的交互,这个操作在ssh时很重要;又比如ftp交互完成传输一个文件后,可以通过interact,使得用户仍停留在ftp的CLI。
exec COMMAND 用于支持bash命令。默认expect不支持bash命令。
close 主动断开和当前进程的连接(主要取消计时机制,提高效率),而不是默认地从交互窗口中读取EOF来中断;
exit 退出expect脚本的命令,可以通过exit执行一些收尾工作:
exit -onexit{
exec rm /tmp/a
}
其中-onexit选项是必须的,是后面的参数执行后,再推出expect命令。
三、使用案例:
A主机免密登录B主机(B主机IP:192.168.0.2 用户名:root 密码:123456):
选择直接用expect来写脚本auto_ssh.exp:
#!/usr/bin/expect
set timeout 10
# 注意:expect不支持同一行内的注释信息出现,只能换行注释
set password [lindex $argv 0]
# 取脚本后的第一个参数作为密码,因此使用格式为: ./auto_ssh.exp 123456
spawn ssh [email protected]
expect "password:"
send "$password
"
interact
以上简单地实现免密登录主机B。
以上是关于Linux之expect命令免交互实现的主要内容,如果未能解决你的问题,请参考以下文章