如何让“期望”切换到交互模式?

时间:2012-03-29 13:20:43

标签: expect

我正在编写我的第一个期望脚本来运行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会将整个脚本置于等待我输入域但不读取键盘或“发送”的状态。我推测这与在前台stdin中没有绑定的后台进程中生成的gvfs-mount有关。

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

感谢。

1 个答案:

答案 0 :(得分: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

您还可以通过在块内放置一个返回来跳转和跳出交互:

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

当用户输入再见并点击输入时,这将退出interactive语句。