园区网站建设方案,网站前端和后端,如何做电子海报在网站,网站建设相关业务原文https://blog.csdn.net/jxdl6655/article/details/78626749
expect可以实现shell实现不了的用户交互的需求。expect可以将交互写在一个脚本上#xff0c;完成很多自动化的动作#xff0c;比如ssh、ftp登陆等#xff0c;都是需要交互需求的。expect是需要安装的#xf…原文https://blog.csdn.net/jxdl6655/article/details/78626749
expect可以实现shell实现不了的用户交互的需求。expect可以将交互写在一个脚本上完成很多自动化的动作比如ssh、ftp登陆等都是需要交互需求的。expect是需要安装的直接yum -y install expect安装即可。
expect的四个关键命令为spawn、expect、send、set其中spawn是调用要执行的命令expect是等待命令提示信息的出现也即捕捉用户提示信息send是发送需要交互的信息来替代手工的输入set则是输入变量值。
一、expect关键语法
1、关键语法
#!/usr/bin/expect 这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。 注意这一行需要在脚本的第一行。
spawn 调用要执行的命令 expect 只有spawn执行的命令的执行结果才被expect捕捉到主要包括标准输入的提示信息、eof和timeout。等待命令提示信息的出现也就是捕捉用户输入的提示 send 发送需要交互的值替代了用户手动输入内容 set 设置变量值 interact 执行完成后保持交互状态把控制权交给控制台这个时候就可以手工操作了。如果没有这一句登录完成后会退出而不是留在远程终端上。 expect eof 这个一定要加与spawn对应表示捕获终端输出信息终止类似于if....endif
PSexpect脚本必须以interact或expect eof结束执行自动化任务通常expect eof就够了。
2、常见设置
set timeout -1 设置expect永不超时
set timeout 300 设置expect 300秒超时如果超过300没有expect内容出现则退出
PS为什么要设置超时时间因为默认时间是10s则在交互执行的过程中很可能会断开导致任务执行没完成就终止。我司的一个从远程ftp上同步文件的计划任务总是执行终止后来设置了超时时间为-1就可以了。
二、expect的用法示例
1、一个简单的拉取文件的例子 --------------------- 2、一个小例子用于linux下账户的建立 以上脚本的注意点如下 第3行 对变量赋值的方法 第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下一个命令但是不要依赖这种行为很有可能今天还可以明天就不能用了 3、下面这个例子比较特殊在整个过程中就不能expect eof了 ---------------------
这个例子实际上是通过ssh去登录远程机器并且在远程机器上创佳一个目录我们看到在我们输入密码后并没有去expect eof这是因为ssh这个spawn并没有结束而且手动操作时ssh实际上也不会自己结束除非你exit所以你只能expect bash的提示符当然也可以是机器名等这样才可以在远程创建一个目录。注意请不要用spawn mkdir tmpdir这样会使得上一个spawn即ssh结束那么你的tmpdir将在本机建立。当然实际情况下可能会要你确认ssh key可以通过并行的expect进行处理不多赘述。 PS:在shell脚本中插入expect命令格式为如下