【问题标题】:"interact" doesn't work when expect script contents are piped into当期望脚本内容被输入时,“交互”不起作用
【发布时间】:2013-02-26 19:04:47
【问题描述】:

我正在构建一个简单的 ssh 登录包装工具来帮助自动登录到众多服务器中的一个。
它首先从用户输入中获取描述,然后提取相应的(最相关的)服务器 IP 和安全存储在某处的密码,并使用它创建一段期望脚本。

expect 脚本如下所示:

spawn ssh2 -q -t Bob@172.23.24.35 预计 { "assword:" {发送 "Bob123\r"} } 相互作用

当我通过管道将其期望(期望可以从标准输入读取脚本)时,一切 进展顺利,直到它达到“交互”。 期望它收到 eof 和 立即终止。然后我将它存储到一个文件中说 tmp.exp 同样的问题 当我做“期望

我认为原因是“交互”从 fd0 获取输入,该输入被我的程序(或 shell)重定向到管道。 这是否意味着当我这样做时我不能使用交互 像“expect

【问题讨论】:

    标签: linux shell expect


    【解决方案1】:

    不确定TclExpect 是否提供了一种内置方法来检查文件描述符是否为tty。我是这样做的:

    $ cat foo.exp
    if { [catch { system {[[ -t 0 ]]} } error] } {
        puts "stdin is not a tty"
    } else {
        puts "stdin is a tty"
    }
    $ expect foo.exp
    stdin is a tty
    $ expect < foo.exp
    stdin is not a tty
    $
    

    【讨论】:

      【解决方案2】:

      我只是想出了一个方法来做到这一点。看这个例子:

      $ cat foo.exp
      if {[catch {
          #  Close stdin and reopen it as /dev/tty. Then we are
          #+ connecting to a tty.
          close stdin
          open /dev/tty
      } err]} {
          puts stderr $err
          exit 1
      }
      
      # Without this, inputed lines will be echo'ed twice.
      set stty_init -echo
      spawn bash --noprofile --norc
      
      expect -re {bash-[.0-9]+(#|\$) }
      interact
      
      exit
      $ expect < foo.exp
      spawn bash --noprofile --norc
      bash-4.2# ptree $$
      705   screen -T dtterm -U
        24164 bash
          26826 expect
            26827 bash --noprofile --norc
              26830 ptree 26827
      bash-4.2# exit
      exit
      $
      

      为了让它更智能,我们需要在开始时检查 stdin 是否为 tty。

      【讨论】:

      • 这确实有效!然而,一些终端属性似乎搞砸了。例如,当我以这种方式登录到另一台服务器并按退格键时,它会打印一个“^H”符号而不是删除最后一个字符。并且键入“exit”不会退出会话。本地文件版本一切正常,我想我不想进一步处理终端。
      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多