Net::OpenSSH中的交互模式

3

我是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个回答

1

Net::OpenSSH默认以交互模式运行,让底层ssh进程在所有其他身份验证方法失败时请求密码(您必须请求batch_mode来禁用它)。

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

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

您也可以在 GitHub 错误跟踪器 中创建一个功能请求,我最终会添加支持接受多个密钥而不使用 master_opts hack。


谢谢您的回复,salva。 - vatsal
当我传递PreferredAuthentications=password选项时,我只能让密码提示工作。如果键身份验证失败,则不尝试使用键盘输入。我正在使用模块的0.64版本。`$ssh = Net::OpenSSH->new($host, user => $login, key_path => $key, master_opts => [ '-v'

, -o => "PreferredAuthentications=password"

, -o => "PubkeyAuthentication=no" ], );`我想要作为从输入中获取的用户进行ssh连接。这是没有任何选项的调试输出:
- vatsal
debug1: 已发送SSH2_MSG_KEX_DH_GEX_INIT debug1: 收到SSH2_MSG_KEX_DH_GEX_REPLY debug1: 主机'host'已知并匹配RSA主机密钥。 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: 可继续进行的身份验证方式:publickey,password,keyboard-interactive debug1: 没有更多的身份验证方法可尝试。 Permission denied (publickey,password,keyboard-interactive). - vatsal
@vatsal:这是因为当您显式请求公钥身份验证(即传递“key_path”参数)时,该模块会禁用密码身份验证。 - salva
有没有一种方法可以覆盖它?比如说,如果密钥失败了,它会回退到密码验证? - vatsal
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接