【问题标题】:How do I get "expect" to toggle in and out of interactive mode?如何让“期望”进入和退出交互模式?
【发布时间】:2012-03-29 13:20:43
【问题描述】:

我正在编写我的第一个期望脚本来运行 gvfs-mount。我希望期望 wcript 将提示回答为“密码:”允许我输入密码,然后切换回非交互模式以完成。

我希望修改这个由 autoexpect 生成并被我稍微去个性化的脚本:

#!/usr/bin/expect -f
set timeout -1
spawn gvfs-mount {smb://my-userid@10.253.x.y/my-userid$}
match_max 100000
expect -exact "Password required for share my-userid\$ on 10.253.x.y\r\nDomain \[WORKGROUP\]: "
send -- "my-domain\r"
expect -exact "my-domain\r\nPassword: "
send -- "my-password\r"
expect eof

只需在第二次发送中将 -exact 更改为 -i 即可将整个脚本置于等待我输入域但不读取键盘或“发送”的状态。我推测这与在与前台标准输入无关的后台进程中生成 gvfs-mount 有关。

那么如何切换一些“期望”的交互性呢?

谢谢。

【问题讨论】:

    标签: expect


    【解决方案1】:

    这就是我的做法。我不参与互动,并欺骗用户认为他们正在输入密码,因此我可以将其存储在变量中。

    expect "*?assword:*" {
      stty -echo
      if {[string length $lpass] < 1} {
        expect_user {
          -re "(.*)\n" {set lpass "$expect_out(1,string)"}
          timeout {exp_continue}
        }
      }
      send -- "$lpass\r"
    }
    stty echo
    

    您还可以通过在块内放置一个 return 来跳入和跳出交互,如下所示:

    interact -nobuffer -re "goodbye\r" {
      return
    }
    send_user -- "you're no longer interacting with the spawned process\n"
    

    当用户输入再见并按回车时,这将退出交互语句。

    【讨论】:

    • 您可能希望在让用户输入密码之前先stty -echo(当然之后再输入stty echo
    猜你喜欢
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多