我写了一个期望内部的bash脚本,连接到终端服务器和清除行.
我无法弄清楚我得到的错误,因为我已经给了所有必要的括号.我也不明白无法读取文件“行”:没有这样的文件或目录错误.
请帮助.
我无法弄清楚我得到的错误,因为我已经给了所有必要的括号.我也不明白无法读取文件“行”:没有这样的文件或目录错误.
请帮助.
我的剧本:
#!/bin/bash VAR=$(expect -c " spawn telnet 1.1.1.1 expect { "Password:" { send "password\r" ; exp_continue} "Prompt>" { send "en\r" ; exp_continue} "Password:" { send "password\r" ; exp_continue} "Prompt#" {send "clea line 10\r" ; exp_continue} "[confirm]" {send "Y\r" ; exp_continue} "Prompt#" {send "clea line 11\r" ; exp_continue} "[confirm]" {send "Y\r" ; exp_continue} "Prompt#" {send "exit\r" } } ") echo $VAR
它的输出:
missing close-brace while executing "expect" Couldn't read file "line": no such file or directory
第一个问题是shell不会像你想的那样解释嵌套的双引号.解决这个问题的最简单方法是将Expect程序放在单引号中.只要Expect程序本身没有单引号,这就足够了.
您将遇到的下一个问题是,在单个expect命令中拥有所有模式和操作将并行处理它们.实际发生的是,第一个密码:模式将在它看到该字符串时(即使第二次使用管理员密码)匹配.如果两个密码需要不同,这将是一个问题.至少,相同的模式需要进入单独的期望命令,以便它们可以顺序执行.此问题还会影响提示#模式,您可以在其中查找三次,并希望发送三个不同的响应.
稍后,在发送第一个clear命令后,您将收到错误消息. Expect以类似于shell解释$()或“(即命令替换)的方式解释双引号内的方括号.你会看到这样的错误:
invalid command name "confirm" while executing "confirm" invoked from within "expect { ⋮
它试图将确认作为Tcl(或Expect)命令运行.您可以使用大括号({})来阻止Tcl进行此解释.此外,期望模式默认被视为“glob”表达式(例如shell通配符),因此即使您将{[confirm]}写为模式,它仍然不会用于精确的字符串匹配(它将匹配任何单个字符c,o,n,f,i,r或m).必须使用-ex标志来标记模式以进行精确匹配.
修复这些问题,删除一些不必要的引用,你可能会得到这样的结果:
#!/bin/sh VAR=$(expect -c ' proc abort {} { puts "Timeout or EOF\n" exit 1 } spawn telnet 1.1.1.1 expect { Password: { send "password1\r" } default abort } expect { Prompt> { send "en\r"; exp_continue } Password: { send "password2\r" } default abort } expect { Prompt# { send "clea line 10\r"; exp_continue } -ex {[confirm]} { send "Y\r" } default abort } expect { Prompt# { send "clea line 11\r"; exp_continue } -ex {[confirm]} { send "Y\r" } default abort } expect { Prompt# { send "exit\r"; exp_continue } timeout abort eof } puts "Finished OK\n" ') echo "$VAR"
原文地址:https://www.jb51.cc/bash/387120.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。