Expect / Tcl脚本:如何在不写入stdout的情况下提示用户?

时间:2014-02-07 01:55:36

标签: perl ssh tcl expect

在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

谢谢!

1 个答案:

答案 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可能需要变得更漂亮。这只是你需要的基础。