加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在bash脚本中帮助Expect

发布时间:2020-12-15 19:02:15 所属栏目:安全 来源:网络整理
导读:我写了一个期望内部的bash脚本,连接到终端服务器和清除行. 我无法弄清楚我得到的错误,因为我已经给了所有必要的括号.我也不明白无法读取文件“行”:没有这样的文件或目录错误. 请帮助. 我的剧本: #!/bin/bash VAR=$(expect -c " spawn telnet 1.1.1.1 expe
我写了一个期望内部的bash脚本,连接到终端服务器和清除行.
我无法弄清楚我得到的错误,因为我已经给了所有必要的括号.我也不明白无法读取文件“行”:没有这样的文件或目录错误.
请帮助.

我的剧本:

#!/bin/bash  
VAR=$(expect -c "  
spawn telnet 1.1.1.1   
expect {  
       "Password:" { send "passwordr" ; exp_continue}  
       "Prompt>" { send "enr" ; exp_continue}  
       "Password:" { send "passwordr" ; exp_continue}  
       "Prompt#" {send "clea line 10r" ; exp_continue}  
       "[confirm]" {send "Yr" ; exp_continue}  
       "Prompt#" {send "clea line 11r" ; exp_continue}  
       "[confirm]" {send "Yr" ; exp_continue}  
       "Prompt#" {send "exitr" }  
    }  
")  

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 EOFn"
    exit 1
  }
  spawn telnet 1.1.1.1
  expect {
    Password:        { send "password1r" }
    default          abort
  }
  expect {
    Prompt>          { send "enr"; exp_continue }
    Password:        { send "password2r" }
    default          abort
  }
  expect {
    Prompt#          { send "clea line 10r"; exp_continue }
    -ex {[confirm]}  { send "Yr" }
    default          abort
  }
  expect {
    Prompt#          { send "clea line 11r"; exp_continue }
    -ex {[confirm]}  { send "Yr" }
    default          abort
  }
  expect {
    Prompt#          { send "exitr"; exp_continue }
    timeout          abort
    eof
  }
  puts "Finished OKn"
')

echo "$VAR"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读