【发布时间】: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。