【问题标题】:Interactive mode in Net::OpenSSHNet::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 只能接收一个。我该如何解决这个问题?

【问题讨论】:

    标签: perl ssh 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 参数)时模块禁用密码身份验证。
    • 有没有办法覆盖它?假设如果密钥失败,它会退回到密码身份验证?
    猜你喜欢
    • 2019-10-27
    • 2014-02-21
    • 2010-12-28
    • 1970-01-01
    • 2020-08-17
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多