首页 expect学习笔记及实例详解

expect学习笔记及实例详解

举报
开通vip

expect学习笔记及实例详解 expectexpectexpectexpect学习笔记及实例详解 1. expect 是基于 tcl 演变而来的,所以很多语法和tcl 类似,基本的语法如下 所示: 1.1 首行加上/usr/bin/expect 1.2 spawn: 后面加上需要执行的shell 命令,比如说 spawn sudo touch testfile 1.3 expect: 只有 spawn 执行的命令结果才会被expect 捕捉到,因为 spawn 会启 动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入...

expect学习笔记及实例详解
expectexpectexpectexpect学习笔记及实例详解 1. expect 是基于 tcl 演变而来的,所以很多语法和tcl 类似,基本的语法如下 所示: 1.1 首行加上/usr/bin/expect 1.2 spawn: 后面加上需要执行的shell 命令,比如说 spawn sudo touch testfile 1.3 expect: 只有 spawn 执行的命令结果才会被expect 捕捉到,因为 spawn 会启 动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括: 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 输入的提 示信息,eof 和 timeout。 1.4 send 和 send_user:send 会将 expect 脚本中需要的信息发送给spawn 启动 的那个进程,而 send_user 只是回显用户发出的信息,类似于 shell 中的 echo 而 已。 2. 一个小例子,用于 linux 下账户的建立: filename: account.sh,可以使用./account.sh newaccout 来执行; 1 #!/usr/bin/expect 2 3 set passwd "mypasswd" 4 set timeout 60 5 6 if {$argc != 1} { 7 send "usage ./account.sh \$newaccount\n" 8 exit 9 } 10 11 set user [lindex $argv [expr $argc-1]] 12 13 spawn sudo useradd -s /bin/bash -g mygroup -m $user 14 15 expect { 16 "assword" { 17 send_user "sudo now\n" 18 send "$passwd\n" 19 exp_continue 20 } 21 eof 22 { 23 send_user "eof\n" 24 } 25 } 26 27 spawn sudo passwd $user 28 expect { 29 "assword" { 30 send "$passwd\n" 31 exp_continue 32 } 33 eof 34 { 35 send_user "eof" 36 } 37 } 38 39 spawn sudo smbpasswd -a $user 40 expect { 41 "assword" { 42 send "$passwd\n" 43 exp_continue 44 } 45 eof 46 { 47 send_user "eof" 48 } 49 } 3. 注意点: 第 3 行: 对变量赋值的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 ; 第 4 行: 默认情况下,timeout 是 10 秒; 第 6 行: 参数的数目可以用$argc 得到; 第 11 行:参数存在$argv 当中,比如取第一个参数就是[lindex $argv 0];并且 如果需要计算的话必须用expr,如计算 2-1,则必须用[expr 2-1]; 第 13行:用 spawn 来执行一条 shell 命令,shell 命令根据具体情况可自行调整; 有文章说 sudo 要加-S,经过实际测试,无需加-S亦可; 第 15 行:一般情况下,如果连续做两个expect,那么实际上是串行执行的,用 例子中的结构则是并行执行的,主要是看匹配到了哪一个;在这个例子中,如果 你写成串行的话,即 expect "assword" send "$passwd\n" expect eof send_user "eof" 那么第一次将会正确运行,因为第一次 sudo 时需要密码;但是第二次运行时由于 密码已经输过(默认情况下 sudo 密码再次输入时间为5 分钟),则不会提示用户 去输入,所以第一个 expect 将无法匹配到 assword,而且必须注意的是如果是 spawn命令出现交互式提问的但是expect匹配不上的话,那么程序会按照timeout 的设置进行等待;可是如果 spawn 直接发出了 eof 也就是本例的情况,那么 expect "assword"将不会等待,而直接去执行expect eof。 这时就会报 expect: spawn id exp6 not open,因为没有 spawn 在执行,后面的 expect 脚本也将会因为这个原因而不再执行;所以对于类似sudo 这种命令分支 不定的情况,最好是使用并行的方式进行处理; 第 17行:仅仅是一个用户提示而已,可以删除; 第 18行:向 spawn 进程发送 password; 第 19 行:使得 spawn 进程在匹配到一个后再去匹配接下来的交互提示; 第 21行:eof 是必须去匹配的,在 spawn 进程结束后会向 expect 发送 eof;如果 不去匹配,有时也能运行,比如sleep 多少秒后再去 spawn 下一个命令,但是不 要依赖这种行为,很有可能今天还可以,明天就不能用了; 4. 其他 下面这个例子比较特殊,在整个过程中就不能expect eof 了: 1 #!/usr/bin/expect 2 3 set timeout 30 4 spawn ssh 10.192.224.224 5 expect "password:" 6 send "mypassword\n" 7 expect "*$" 8 send "mkdir tmpdir\n" 9 expect "*$" 这个例子实际上是通过ssh 去登录远程机器,并且在远程机器上创佳一个目录, 我们看到在我们输入密码后并没有去expect eof,这是因为 ssh 这个 spawn 并没 有结束,而且手动操作时ssh 实际上也不会自己结束除非你exit;所以你只能 expect bash 的提示符,当然也可以是机器名等,这样才可以在远程创建一个目 录。 注意,请不要用 spawn mkdir tmpdir,这样会使得上一个spawn 即 ssh 结束,那 么你的 tmpdir 将在本机建立。 当然实际情况下可能会要你确认ssh key,可以通过并行的 expect 进行处理,不 多赘述。 5. 觉得bash很多情况下已经很强大,所以可能用expect只需要掌握这些就好了, 其他的如果用到可以再去google 了。
本文档为【expect学习笔记及实例详解】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_874939
暂无简介~
格式:pdf
大小:89KB
软件:PDF阅读器
页数:6
分类:互联网
上传时间:2012-10-16
浏览量:13