我正在编写我的第一个期望脚本来运行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有关。
那么如何切换某些“期望”的互动性呢?
感谢。
答案 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语句。