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”