希望学习笔记及实例详解

  期待学习笔记及实例详解 引用自:http://wenku.baidu.com/view/b65e103610661ed9ad51f374.html
1。期望是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下 所示: 1.1首行加上/usr/bin/expect1.2产卵:后面加上需要执行的壳命令,比如说产卵sudo触摸testfile1.3期望:只有产卵执行的命令结果才会被期望捕捉到,因为产卵会启动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提示信息,eof和timeout.1.4发送和send_user:发送会将预期脚本中需要的信息发送给产卵启动的那个进程,而send_user只是回显用户发出的信息,类似于壳中的回声而已。
2。一个小例子,用于linux下账户的建立:文件名:account.sh,可以使用。/帐户。sh newaccout来执行;1 # !/usr/bin/expect23设置密码“mypasswd”4设置超时6056如果{$命令行参数个数!=1}{7发送“使用。/帐户。sh \ $ newaccount \ n " 8 exit9} 1011设置用户[lindex $ argv [expr argc-1美元]]1213年产卵sudo useradd - s/bin/bash组- g mygroup - m美元user1415期望{16“assword”{17 send_user“sudo \ n”18日发送“passwd美元\ n”19日exp_continue20} 21 eof22 {23 send_user eof \ n " 24} 25}产卵sudo密码2627 user28期望{29“assword”{30发送" $ passwd \ n " 31 exp_continue32} 33 eof34 {35 send_user eof“36} 37}产卵sudo smbpasswd——3839 user40期望{41“assword”{42发送" $ passwd \ n " 43 exp_continue44} 45 eof46 {47 send_user“eof”48} 49}
3。注意点:
第3行:对变量赋值的方法,第4行:默认情况下,超时时间是10秒;第6行:参数的数目可以用命令行参数个数美元得到;第11行:参数存在$ argv当中,比如取第一个参数就是lindex $ argv[0],并且如果需要计算的话必须用expr,如计算2 - 1,则必须用[expr 2 - 1];第13行:用产卵来执行一条壳牌命令,壳牌命令根据具体情况可自行调整,有文章说sudo要加- s,经过实际测试,无需加s亦可;第15行:一般情况下,如果连续做两个料,那么实际上是串行执行的,用。期待与“{”之间直接必须有空格或则标签间隔,否则会出麻烦,会报错 无效的命令名”预计{”例子中的结构则是并行执行的,主要是看匹配到了哪一个,在这个例子中,如果你写成串行的话,即期望“assword“发送”美元passwd \ n”预计eofsend_user”eof”那么第一次将会正确运行,因为第一次sudo时需要密码;但是第二次运行时由于密码已经输过(默认情况下sudo密码再次输入时间为5分钟),则不会提示用户去输入,所以第一个预计将无法匹配到assword,而且必须注意的是如果是产卵命令出现交互式提问的但是期望匹配不上的话,那么程序会按照超时的设置进行等待;可是如果产卵直接发出了eof也就是本例的情况,那么期待“assword”将不会等待,而直接去执行预计eof。这时就会报期望:产卵id exp6不开放,因为没有产卵在执行,后面的期望脚本也将会因为这个原因而不再执行,所以对于类似sudo这种命令分支不定的情况,最好是使用并行的方式进行处理;第17行:仅仅是一个用户提示而已,可以删除;第18行:向产卵进程发送密码;第19行:使得产卵进程在匹配到一个后再去匹配接下来的交互提示;第21行:eof是必须去匹配的,在产卵进程结束后会向预计发送eof;如果不去匹配,有时也能运行,比如多睡少秒后再去产生下一个命令,但是不要依赖这种行为,很有可能今天还可以,明天就不能用了。
4。其他下面这个例子比较特殊,在整个过程中就不能指望eof了:1 # !/usr/bin/expect23设置超时304产卵ssh 10.192.224.2245期望“密码:6“我的密码\ n”发送7预计美元“*”8 发送“mkdir tmpdir \ n”#远程执行命令用发送发送,不用产卵 9预计“* $ " #注意这个地方,要与操作系统上环境变量PS1相匹配,尤其是有PS1有空格的情况下,一定在expct“* $”把空格加上,加不上你就完蛋了。我试过。这个例子实际上是通过ssh去登录远程机器,并且在远程机器上创佳一个目录,我们看到在我们输入密码后并没有去期望eof,这是因为ssh这个产卵并没有结束,而且手动操作时ssh实际上也不会自己结束除非你退出,所以你只能指望bash的提示符,当然也可以是机器名等,这样才可以在远程创建一个目录。注意,请不要用产卵mkdir tmpdir, 这样会使得上一个产卵即ssh结束,那么你的tmpdir将在本机建立。当然实际情况下可能会要你确认ssh密钥,可以通过并行的期望进行处理,不多赘述。
5。觉得bash很多情况下已经很强大,所以可能用期望只需要掌握这些就好了,其他的如果用到可以再去谷歌了。
源代码图片:期望学习笔记及实例详解“> <h2 class=希望学习笔记及实例详解