Net::OpenSSH 中的交互模式

Posted

技术标签:

【中文标题】Net::OpenSSH 中的交互模式【英文标题】:Interactive mode in Net::OpenSSH 【发布时间】:2018-12-07 16:41:16 【问题描述】:

我是 perl 的初学者,正在尝试编写一个使用 Net::OpenSSH 在给定主机上运行命令的脚本。如何在 Net::OpenSSH 中进行交互模式身份验证,类似于我们在 Net:SSH::Perl 中的身份验证。 Net:SSH::Perl 有一个交互式标志,如果设置为 true,则输入密码,否则为公钥验证。以下是我在 Net::SSH::Perl 中拥有的 ssh 对象,我想在 Net::OpenSSH 中复制它:

 $ssh = Net::SSH::Perl->new($host,
                      debug          => $debug,
                      port           => $port,
                      interactive    => $imode,
                      identity_files => [ @keys ],
                      );

Net::SSH::Perl 也可以接收一组密钥,而 Net::OpenSSH 只能接收一个。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

Net::OpenSSH 默认已经在交互模式下运行,当所有其他身份验证方法都失败时,让底层ssh 进程要求输入密码(您必须请求batch_mode 才能禁用它)。

您可以通过 master_opts 构造函数参数传递多个键:

my $ssh = Net::OpenSSH->new($host, ...
                            master_opts => [map  -i => $_  @keys]);

您还可以在 GitHub bug-tracker 中创建功能请求,我最终将添加对接受多个密钥的支持,而无需使用 master_opts hack。

【讨论】:

感谢萨尔瓦的回复。 只有当我通过 PreferredAuthentications=password 选项时,密码提示才能正常工作。当我不这样做时,如果密钥验证失败,它不会尝试使用键盘输入。我正在使用该模块的 0.64 版本。 $ssh = Net::OpenSSH->new($host, user => $login, key_path => $key, master_opts => [ '-v' # , -o => "PreferredAuthentications=password" , -o => "PubkeyAuthentication=no" ], ); 我想以用户身份从输入中获取 ssh。这是不带任何选项的调试输出: debug1: SSH2_MSG_KEX_DH_GEX_INIT sent debug1: got SSH2_MSG_KEX_DH_GEX_REPLY debug1: Host 'host' is known and match the RSA host key. debug1:在 ~/.ssh/known_hosts:5 中找到密钥 debug1:在 4294967296 块后重新生成密钥 debug1:SSH2_MSG_NEWKEYS 已发送 debug1:期待 SSH2_MSG_NEWKEYS debug1:SSH2_MSG_NEWKEYS 已收到 debug1:在 4294967296 块后重新加密 debug1:SSH2_MSG_SERVICE_ACCEPT 已收到 debug1密码,键盘交互式调试1:没有更多的身份验证方法可以尝试。权限被拒绝(公钥、密码、键盘交互)。 @vatsal:发生这种情况是因为当您明确请求公钥身份验证(即传递key_path 参数)时模块禁用密码身份验证。 有没有办法覆盖它?假设如果密钥失败,它会退回到密码身份验证?

以上是关于Net::OpenSSH 中的交互模式的主要内容,如果未能解决你的问题,请参考以下文章

解决 Net::OpenSSH 问题并将多个命令传递给路由器

$SIGINT='IGNORE' 不适用于 Net::OpenSSH

如何使用 perl 和 Net::OpenSSH 在远程机器上启动后台进程?

使用 Net::OpenSSH 和 Solaris SSH 客户端的“错误配置选项:ServerAliveInterval”

在 Perl 的 ssh 连接中捕获错误主机名的错误消息(使用 Net::OpenSSH)

Perl:使用 Net::OpenSSH 的 scp_put 拒绝权限