如何在 Perl 脚本中从 ssh 获取密码提示

如何在 Perl 脚本中从 ssh 获取密码提示

当我从命令行执行此操作时,系统提示我输入 joe 的密码(这是我想要的):

ssh -t 192.168.1.32 'scp [email protected]:/etc/hosts /tmp'

当我尝试从 perl 脚本运行相同的命令时,它只是挂在那里(没有提示):

`ssh -t 192.168.1.32 'scp joe\@192.168.1.31:/etc/hosts /tmp'`;

我怎样才能通过 Perl 脚本完成这个工作?

注意:不,我不能对此使用基于密钥的身份验证。

答案1

您可以使用 Expect。请参阅https://stackoverflow.com/a/1366802

(以及有关此主题的 Expect 模块常见问题解答http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod#I_want_to_automate_password_entry_for_su/ssh/scp/rsh/... )

答案2

你可以使用 Perl 的Net::SCP对于这个,这将是最干净的(全 perl,没有外部命令调用)解决方案。

或者你可以这样做安德鲁建议并使用 Expect(可能更快)。

或者您可以fork(),,exec()waitpid()(让您的scp命令拥有运行 Perl 脚本的终端,以便它可以从您那里获取密码,这是一种不错的老式 Unix-y 方法,但比我个人愿意做的工作要多得多)。

蒂姆托迪。:-)

答案3

我以前也遇到过同样的问题。

它挂起的原因是 ssh 生成了一个用于输入密码的终端。Perl 无法捕获此终端(出于某种原因)。perl 从未见过“密码”字符串。

最好使用库(Net::SSH2 库或类似的东西)。

相关内容