linux的expect

expect expect学习笔记及实例详解
(参考链接[url]http://wenku.baidu.com/view/b65e103610661ed9ad51f374.html[/url])
1.expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下
所示:
1.1首行加上/usr/bin/expect
1.2spawn:后面加上需要执行的shell命令,比如说spawnsudotouchtestfile
1.3expect:只有spawn执行的命令结果才会被expect捕捉到,因为spawn会启
动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提
示信息,eof和timeout。
1.4send和send_user:send会将expect脚本中需要的信息发送给spawn启动
的那个进程,而send_user只是回显用户发出的信息,类似于shell中的echo而
已。
2.一个小例子,用于linux下账户的建立:
filename:account.sh,可以使用./account.shnewaccout来执行;

1#!/usr/bin/expect
2
3setpasswd"mypasswd"
4settimeout60
5
6if{$argc!=1}{
7 send"usage./account.sh\$newaccount\n"
8 exit
9}
10
11setuser[lindex$argv[expr$argc-1]]
12
13spawnsudouseradd-s/bin/bash-gmygroup-m$user
14
15expect{
16 "assword"{
17 send_user"sudonow\n"
18 send"$passwd\n"
19 exp_continue
20 }
21 eof
22 {
23 send_user"eof\n"
24 }
25}
26
27spawnsudopasswd$user
28expect{
29 "assword"{
30 send"$passwd\n"
31 exp_continue
32 }
33 eof
34 {
35 send_user"eof"
36 }
37}
38
39spawnsudosmbpasswd-a$user
40expect{
41 "assword"{
42 send"$passwd\n"
43 exp_continue
44 }
45 eof
46 {
47 send_user"eof"
48 }
49}


3.注意点:
第3行:对变量赋值的方法;
第4行:默认情况下,timeout是10秒;
第6行:参数的数目可以用$argc得到;
第11行:参数存在$argv当中,比如取第一个参数就是[lindex$argv0];并且
如果需要计算的话必须用expr,如计算2-1,则必须用[expr2-1];
第13行:用spawn来执行一条shell命令,shell命令根据具体情况可自行调整;
有文章说sudo要加-S,经过实际测试,无需加-S亦可;
第15行:一般情况下,如果连续做两个expect,那么实际上是串行执行的,用
例子中的结构则是并行执行的,主要是看匹配到了哪一个;在这个例子中,如果
你写成串行的话,即
expect"assword"
send"$passwd\n"
expecteof
send_user"eof"
那么第一次将会正确运行,因为第一次sudo时需要密码;但是第二次运行时由于
密码已经输过(默认情况下sudo密码再次输入时间为5分钟),则不会提示用户
去输入,所以第一个expect将无法匹配到assword,而且必须注意的是如果是
spawn命令出现交互式提问的但是expect匹配不上的话,那么程序会按照timeout
的设置进行等待;可是如果spawn直接发出了eof也就是本例的情况,那么expect
"assword"将不会等待,而直接去执行expecteof。
这时就会报expect:spawnidexp6notopen,因为没有spawn在执行,后面的
expect脚本也将会因为这个原因而不再执行;所以对于类似sudo这种命令分支
不定的情况,最好是使用并行的方式进行处理;
第17行:仅仅是一个用户提示而已,可以删除;
第18行:向spawn进程发送password;
第19行:使得spawn进程在匹配到一个后再去匹配接下来的交互提示;
第21行:eof是必须去匹配的,在spawn进程结束后会向expect发送eof;如果
不去匹配,有时也能运行,比如sleep多少秒后再去spawn下一个命令,但是不
要依赖这种行为,很有可能今天还可以,明天就不能用了;
4.其他
下面这个例子比较特殊,在整个过程中就不能expecteof了:

1 #!/usr/bin/expect
2
3 settimeout30
4 spawnssh10.192.224.224
5 expect"password:"
6 send"mypassword\n"
7 expect"*$"
8 send"mkdirtmpdir\n"
9 expect"*$"


这个例子实际上是通过ssh去登录远程机器,并且在远程机器上创佳一个目录,
我们看到在我们输入密码后并没有去expecteof,这是因为ssh这个spawn并没
有结束,而且手动操作时ssh实际上也不会自己结束除非你exit;所以你只能
expectbash的提示符,当然也可以是机器名等,这样才可以在远程创建一个目
录。
注意,请不要用spawnmkdirtmpdir,这样会使得上一个spawn即ssh结束,那
么你的tmpdir将在本机建立。
当然实际情况下可能会要你确认sshkey,可以通过并行的expect进行处理,不
多赘述。
5.觉得bash很多情况下已经很强大,所以可能用expect只需要掌握这些就好了,
其他的如果用到可以再去google了。

expect命令详解
参考链接:[url]http://wenku.baidu.com/link?url=ZAy9QuHSEiLrQuJSKqcw6NIOaFFAgR021t39lh9JAe-hS_Mbu96XibGKIwcLe4CltcIpJJY4LqauIdQ-VZGY-ojcEAmQAUVvj-gh4mfII9C[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值