在Expect脚本中,如何在不写入stdout的情况下提示用户?是否可以通过stderr提示用户?
我有一个用Perl编写的脚本,可以使用ssh自动进行一些测试。为了自动登录ssh,我使用Expect包装了ssh命令,但有时ssh的密码在执行代码的过程中会到期(例如rsa标记每30秒刷新一次)。
我发现了这个:How can I make an expect script prompt for a password?
效果很好,除了它通过stdout提示用户。我的Perl脚本读取并解析stdout。
我想在不修改Perl代码的情况下将其抽象到我的Expect脚本,是否可能?
编辑:我刚刚意识到我的用例是愚蠢的,因为我不确定Perl是如何能够与Expect脚本提示进行交互的,因为我从Perl调用了Expect脚本。 :/ 但是知道是否有可能期望写入stderr仍然很好。:D
谢谢!
答案 0 :(得分:1)
您可以尝试访问“文件”/dev/tty
(它实际上是一个虚拟设备)。这将绕过Perl脚本并直接联系用户的终端。打开后,使用正常的Expect命令要求用户提供密码(记住在stty
时正确关闭回声)。
否则,你最好的选择可能是弹出一个GUI;使用一点Tcl / Tk脚本来做这件事非常简单:
# This goes in its own script:
pack [label .l -text "Password for [lindex $argv 0]"]
pack [entry .e -textvariable pass -show "*"]
bind .e <Enter> {
puts $pass
exit
}
focus .e
# In your expect script:
set password [exec wish getPass.tcl "foo@bar.example.com"]
这就是全部。它也是一种获得密码的合理安全方式,因为密码始终由(不可拦截的)管道传递。唯一的缺点是它需要一个GUI。
GUI可能需要变得更漂亮。这只是你需要的基础。