一种TCL扩展性语言,使用一种自动的方式来模拟人手工互动的过程。
exepect命令:
1、spawn 启动一个进程,其后所有expect操作都在该进程中执行;
spawn ssh root@10.137.86.123
支持其他选项:
-open 启动文件进程
ignore 忽略某些信号
2、expect 表达式 动作 表达式 动作 。。。
用于等候一个相匹配的输出,匹配上则执行后面的动作
spawn ssh root@10.137.86.123
expect "password:" {exp_send "word\r"}
也可以如下
spawn ssh root@10.137.86.123
expect "password:"
exp_send 'word\r"
可同时匹配多个关键字
spawn ssh root@10.137.86.123
expect {
-re "password:" {exp_send "word\r"}
-re "TopsecOS#" { }
}
3、expect_user 匹配从用户那里的输入,代替了expect的匹配操作
expect_user {
-re hello //从用户那获取输入,匹配是否为hello
{puts stdout "HELLO"; exp_continue} //exp_continue命令的存在,该程序会一直循环
-re hi
{puts stdout "HI"; exp_continue}
}
4、exp_send expect中的动作命令,同send相同
可用参数:
-i 指定spawn_id,可向不同spawn_id进程发送命令,多程序控制关键参数。
-s 表示slowly,即发送速度控制,使用时要与send_slow相关联。
5、exp_continue 也属动作命令,从头开始遍历,即匹配第一个关键字后,第二次匹配仍然从第一个关键字开始
6、exp_internal 打开expect调试模式的命令
接受值包括:非0(打开调试)、0(关闭调试)、-f file(将调试写入文件)
exp_internal –f file 0 调试信息放入文件但不标准输出
exp_internal –f file 1 调试信息放入文件且标准输出
spawn ftp 10.11.105.15
exp_internal 1
expect {
-re "Name" {exp_send "ftp\r"; exp_continue}
-re "Pass" {exp_send "ftp\r"; exp_continue}
-re "ftp>" {exp_send "by\r"}
}
expect eof
7、exp_pid 获取当前spawn的进程号,支持-i选项,用来指定具体spawn进程
set pid [exp_pid -i $spawn_id]
8、send_user 将后面的参数输出到标准输出去,默认的send、exp_send都将参数输出
send_user "please input passwd: "
9、send_error 将后面参数输出到标准错误输出去,同8去向不同
10、 send_log 把后面内容输出到log文件,该命令与log_file命令配合使用,log_file指定了文件则send_log可向其写内容,若无log_file,则send_log无效
11、close 关闭连接,支持-i,若不带任何选项,则关闭当前$spawn_id指定的过程
12、wait 与close类似,关闭连接,但wait等待系统主动返回eof,即结束信号,方可关闭,同样支持-i
13、log_user 指定expect输出位置,默认值为1,即所有输出都放入标准输出中(重定向一可到文件中),若为0,即没有任何输出
14、log_file 将输出记录到文件中
log_file <选项> filename,选项如下:
-open 文件已打开,可往该文件继续添加内容,该情况仅用于windows;
-leaveopen 文件已打开,不继续向该文件添加内容
-noappend 文件已存在,清空文件内容,再写入
-a 文件已存在,则新内容追加文件末尾
15、remove_nulls 去掉返回的控制符,即信号符号
remove_nulls 0 关闭自动去掉控制符功能
remove_nulls 1 开启自动去掉控制符功能
16、maxch_max 设置expect_out(buffer)变量缓存大小,默认是2000字符
match_max 65535
2个选项:
match_max -d 1048576 默认值
match_max -i lo_spawnid 设置某spawn_id指定的进程缓存
17、trap 监听系统信号
3种信号方式:
c的SIGINT、SIGHUP等;
简略的-INT、-SIGHUP;
linux的kill模式,9、15;
trap {
send_user "bye bye\r"
exit
} SIGINT //监听到SIGINT信号,就打印bye bye并退出,SIGINT一般都是ctrl+c
trap {
send_user "signal name is [trap -name]" //-name选项,返回监听信号名称
send_user "signal integer is [trap -number]" //-number选项,返回监听信号数值
exit
} {SIGINT SIGHUP SIGQUIT} //一次性监听多个信号,则把信号一次性赋给trap命令
trap SIG_IGN { SIGINT SIGHUP SIGQUIT} //脚本的前部分取消这些信号,脚本运行期间用户若输入该些信号则被忽略
..............
trap SIG_DFL { SIGINT SIGHUP SIGQUIT} //脚本后部分恢复改些信号
18、exit 退出脚本,也可做一些扫尾
exit -onexit {
exec rm $tmpfile
send_user "Good bye\n"
}
19、interact 在脚本中将控制权交给用户,由用户与spawn生成的进程进行交互
spawn ftp see@10.137.86.123
expect "Password:"
exp_send "see\r"
interact { //将控制权交给用户
"d" {puts [exec date]} //用户若输入d,则打印日期
"q" {exit} //用户若输入q,在退出ftp连接
}
send "\r" //重要,因后面expect命令需要匹配ftp>字符,但interact将控制权交给脚本时,expect的buffer为空,必须用send将提示符推到buffer中
expect { ftp> {send "bye\r"}
}
expect { default {}
}