expectFAQ(附一个python批量任务脚本)--持续更新

expectFAQ(附一个python批量任务脚本)--持续更新 - Shell - ChinaUnix.net -

expectFAQ(附一个python批量任务脚本)--持续更新

 

[复制链接]

0
0

本帖最后由 expert1 于 2012-03-09 17:21 编辑



firstly,版权没有,随意COPY && PASTE,但注意注明出处即可。



前言,这里讲Expect的只言片语,具体要了解需要熟悉TCL语言的相关知识。这里举了最常用的问题,就系统管理而言,足以满足日常需求,若是你做软件自动化测试。要深入了解expect,请下载 http://bbs.chinaunix.net/thread-1769951-1-1.html此外还需要熟悉TCL,毕竟它和TCL相关。

一,expect的FAQ

如何匹配多种情况,典型的例子就是ssh ,第一个可能是yes,然后password,或是直接password。就是并行匹配的情况,见下面例子。
  1. #!/usr/bin/expect
  2.     set timeout 60
  3.     set pwd "该机器的密码"
  4.     spawn ssh  10.10.10.1
  5.            expect {
  6.                       "\[#$\]"     {send "\r" }   ### 假如有了ssh 公钥之类的,直接回车。当然普通用户下边还可能需要sudo,自己处理一下吧。
  7.                     "not know" {send_user "[exec echo \"not know\"]";exit}
  8.                     "(yes/no)?" {send "yes\r";exp_continue} #continue的意义,靠猜测也能差不多知道了吧?可以Man expect
  9.                     "password:" {send  "$pwd\r"}
  10.                     "Permission denied, please try again." {
  11.                         send_user "[exec echo \"Error:Password is wrong\"]"
  12.                         exit  }
  13.                     }

复制代码

####  把所有可能出现的情况列举出来做匹配,假如写法如下就是串行执行了。

expect "*#"

send "ifconfig\r"

send "exit\r"

expect eof # 只有spawn产生的进程的相关信息才能被expect捕捉到,还包含2个特殊情况,eof和timeout,eof关闭spawn 产生的spawn id :exp_id,也就是结束标记。这个eof是必不可少的,至于为什么,我也没找到权威答案,包括手册都没提到,但实践中发现很多时候不加会导致得不到你要的结果。请看下边的一个例子:

  1. #!/usr/bin/expect -f
  2. set ip 10.1.1.1
  3. set pwd 123456
  4. spawn scp ssh.exp root@$ip:/tmp
  5. expect {
  6.          "(yes/no)?" {send "yes\r";exp_continue}
  7.          "password:" {send  "$pwd\r"}
  8.                     }
  9. # expect eof

复制代码

假如最后的expect eof给注释了,文件不会被scp到10.1.1.1上,也许你感觉很奇怪,关键就在于这个eof,我看了相关资料包括debug信息没有找到令人信服的答案。

我个人猜测是,没有eof,那么仅仅是把密码send过去,连回车都没有执行。然后就异常退出了。加了eof部分,让Expect执行完毕,下边才能退出子程序。

你可能感兴趣的:(python)