【问题标题】:Expect/Tcl Script: How to prompt user without writing to stdout?Expect/Tcl 脚本:如何在不写入标准输出的情况下提示用户?
【发布时间】:2014-02-07 01:55:36
【问题描述】:

在 Expect 脚本中,如何在不写入 stdout 的情况下提示用户?是否可以通过stderr提示用户?

我有一个用 Perl 编写的脚本,用于使用 ssh 自动执行一些测试。为了自动登录 ssh,我使用 Expect 封装了 ssh 命令,但有时 ssh 的密码在执行代码中途过期(例如 rsa 令牌每 30 秒刷新一次)。

我发现了这个:How can I make an expect script prompt for a password?

这很好用,除了它通过标准输出提示用户。我的 Perl 脚本读取并解析标准输出。

我想在不修改 Perl 代码的情况下将其抽象到我的 Expect 脚本中,可以吗?

编辑:我刚刚意识到我的用例很愚蠢,因为我不确定 Perl 将如何与 Expect 脚本提示进行交互,因为我是从 Perl 调用 Expect 脚本的。 :/ 但最好知道 Expect 是否可以写入 stderr。 :D

谢谢!

【问题讨论】:

  • 一旦你进入,密码是否过期都没有关系,除非你有一个非常不寻常的 SSH/shell 配置。在不了解细节的情况下,很难给你任何有用的建议。另外,请向我们展示您的代码!
  • 问题是我需要对盒子运行一系列不同的命令。理想情况下,最好生成一个持久的 ssh 会话并通过它传递命令,但每次生成一个新会话更容易。我对 Perl 不太熟悉,无法实现前一种方法。
  • 然后,试试 Net::OpenSSH。
  • 我没有直接查看 Net::OpenSSH 模块,但我尝试过 Net::SSH:Perl,它具有特定于平台的二进制依赖项。成功编译模块有点困难。我假设这与 Net::OpenSSH 类似,它似乎依赖于二进制 ssh 客户端。
  • Net::OpenSSH 需要 OpenSSH ssh 客户端,但这适用于大多数 Unix/Linux。它不能在 Windows 上运行,但 Expect 也不能​​。另一个选项是 Net::SSH::Any。

标签: perl ssh tcl expect


【解决方案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 可能需要变得更漂亮。这只是你需要的最基本的东西。

【讨论】:

  • 子进程 GUI 脚本也可以是任何其他语言,但 Tcl/Tk 是我最了解的。
  • 感谢您的回复。我决定修改我的 Perl 脚本,因为 Perl 脚本应该知道新密码,这样它就可以在不同的调用中重用它,而不必每次都重新验证。 +1 用于展示如何绕过 Perl 脚本并直接访问用户终端/:)。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多