expectFAQ(附一个python批量任务脚本)--持续更新
[复制链接]
0
0本帖最后由 expert1 于 2012-03-09 17:21 编辑 firstly,版权没有,随意COPY && PASTE,但注意注明出处即可。 前言,这里讲Expect的只言片语,具体要了解需要熟悉TCL语言的相关知识。这里举了最常用的问题,就系统管理而言,足以满足日常需求,若是你做软件自动化测试。要深入了解expect,请下载 此外还需要熟悉TCL,毕竟它和TCL相关。 一,expect的FAQ 如何匹配多种情况,典型的例子就是ssh ,第一个可能是yes,然后password,或是直接password。就是并行匹配的情况,见下面例子。
- #!/usr/bin/expect
- set timeout 60
- set pwd "该机器的密码"
- spawn ssh 10.10.10.1
- expect {
- "\[#$\]" {send "\r" } ### 假如有了ssh 公钥之类的,直接回车。当然普通用户下边还可能需要sudo,自己处理一下吧。
- "not know" {send_user "[exec echo \"not know\"]";exit}
- "(yes/no)?" {send "yes\r";exp_continue} #continue的意义,靠猜测也能差不多知道了吧?可以Man expect
- "password:" {send "$pwd\r"}
- "Permission denied, please try again." {
- send_user "[exec echo \"Error:Password is wrong\"]"
- exit }
- }
复制代码
#### 把所有可能出现的情况列举出来做匹配,假如写法如下就是串行执行了。
expect "*#" send "ifconfig\r" send "exit\r" expect eof # 只有spawn产生的进程的相关信息才能被expect捕捉到,还包含2个特殊情况,eof和timeout,eof关闭spawn 产生的spawn id :exp_id,也就是结束标记。这个eof是必不可少的,至于为什么,我也没找到权威答案,包括手册都没提到,但实践中发现很多时候不加会导致得不到你要的结果。请看下边的一个例子:
- #!/usr/bin/expect -f
- set ip 10.1.1.1
- set pwd 123456
- spawn scp ssh.exp root@$ip:/tmp
- expect {
- "(yes/no)?" {send "yes\r";exp_continue}
- "password:" {send "$pwd\r"}
- }
- # expect eof
复制代码
假如最后的expect eof给注释了,文件不会被scp到10.1.1.1上,也许你感觉很奇怪,关键就在于这个eof,我看了相关资料包括debug信息没有找到令人信服的答案。
我个人猜测是,没有eof,那么仅仅是把密码send过去,连回车都没有执行。然后就异常退出了。加了eof部分,让Expect执行完毕,下边才能退出子程序。