【问题标题】:Why is ssh prompting me for a password after I give it to Perl's Net::SSH::Perl?为什么 ssh 在我将密码提供给 Perl 的 Net::SSH::Perl 后提示我输入密码?
【发布时间】:2010-11-24 07:42:17
【问题描述】:

我正在使用 Net::SSH::Perl 在远程服务器上执行如下命令:

use Net::SSH::Perl;
my $ssh = Net::SSH::Perl->new($host);
$ssh->login($user, $pass);
my ($stdout, $stderr, $exit) = $ssh->cmd($cmd);

但是当我执行上面的脚本时,密码提示又来了。这意味着我在 $pass 中提供的密码不会用于建立 ssh 连接。为什么是这样?知道如何克服这个问题吗?我在下面给出调试信息:

serv1: 读取配置数据 /root/.ssh/config
serv1:读取配置数据 /etc/ssh_config
serv1:分配的本地端口 1023。
serv1:连接到 15.154.59.63,端口 22。
serv1:远程协议版本1.99,远程软件版本OpenSSH_4.2
serv1:Net::SSH::Perl 版本 1.34,协议版本 1.5。
serv1:没有兼容匹配:OpenSSH_4.2。
serv1:已建立连接。
serv1:等待服务器公钥。
serv1:收到服务器公钥(768 位)和主机密钥(1024 位)。
serv1:主机 '15.154.59.63' 是已知的并且与主机密钥匹配。
serv1:加密类型:DES3
serv1:发送加密会话密钥。
serv1:收到加密确认。
serv1:RSA 身份验证失败:无法加载公钥。
serv1:进行质询响应认证。
密码:

密码提示不应该是正确的,因为我已经在 $pass 变量中提供了密码?

更新(基于收到的 cmets):

我尝试了以下方法:

my $ssh = Net::SSH::Perl->new($host, debug =>1, identity_files => []);

现在,我没有收到“RSA 身份验证失败:”消息,但仍然出现密码提示。我在下面给出调试信息:

serv1:分配的本地端口 1023。
serv1:连接到 15.154.59.63,端口 22。
serv1:远程协议版本1.99,远程软件版本OpenSSH_4.2
serv1:Net::SSH::Perl 版本 1.34,协议版本 1.5。
serv1:没有兼容匹配:OpenSSH_4.2。 kf-linux-dm3:已建立连接。
serv1:等待服务器公钥。
serv1:收到服务器公钥(768 位)和主机密钥(1024 位)。
serv1:主机 '15.154.59.63' 是已知的并且与主机密钥匹配。
serv1:加密类型:DES3
serv1:发送加密会话密钥。
serv1:收到加密确认。
serv1:进行质询响应认证。
密码:

有人可以启发我吗?

【问题讨论】:

    标签: perl ssh


    【解决方案1】:

    您的错误中的这一行:

    serv1:RSA 身份验证失败:无法加载公钥。

    告诉我你的程序正在尝试做automatic logins,当你需要密码才能登录时,这不是你想要做的。

    查看the Perl/ssh documentation:

    identity_files

    要在 RSA/DSA 身份验证中使用的 RSA/DSA 身份文件列表。此参数的值应该是对字符串数组的引用,每个字符串标识身份文件的位置。每个身份文件都将针对服务器进行测试,直到客户端找到一个成功通过身份验证的文件。

    如果您不提供此选项,则 RSA 身份验证默认使用 $ENV{HOME}/.ssh/identity,DSA 身份验证默认使用 $ENV{HOME}/.ssh/id_dsa。

    您可以尝试将identity_files 设置为一个空数组,看看是否会强制它使用您提供的密码;或者您可以像上面的链接一样继续设置公钥身份验证。

    【讨论】:

    • 将 identity_files 设置为空数组没有帮助 :( 密码提示仍然出现。如果我提供 rsa 密钥文件的路径,我会收到以下错误:“无法使用字符串 (” /root/.ssh/id_rsa.pub") 作为 ARRAY 引用,而在 /usr/lib/perl5/site_perl/5.8.8/Net/SSH/Perl/Auth/RSA.pm 第 40 行使用“严格引用”。 " 知道为什么会这样吗?
    • @Ninja:确保您提供的是一个数组的reference,而不仅仅是一个数组。
    • @Adam:我只传递了一个参考,但它不起作用。我在下面给出了我的代码的 sn-p:@arr = ("");我的 $ssh = Net::SSH::Perl->new($host, debug =>1, identity_files => \@arr);如果我按照 Mark 的建议将 identity_files 设置为空数组,我会收到相同的消息“RSA 身份验证失败:无法加载公钥”。然后密码提示来了。有人请。帮帮我。
    • @arr = ("") 不是一个空数组!使用 [] 代替 \@arr。
    • @Manni:我尝试了以下方法:我的 $ssh = Net::SSH::Perl->new($host, debug =>1, identity_files => []);现在,我没有收到“RSA 身份验证失败:”消息,但仍然出现密码提示:'(
    【解决方案2】:

    serv1:进行质询响应身份验证。

    这是你的关键路线。 SSH 实际上有多种类型的类似密码的身份验证。其中之一是严格的密码验证(由/etc/sshd_config 中的PasswordAuthentication 选项控制),我怀疑这就是您发送的$pass 的用途。另一个是challenge-response authentication,服务器发送一个或多个挑战,您应该回复正确的响应。 RefSpec

    所以,从技术上讲,ssh 不会要求您输入密码。它要求您回复来自服务器的任意质询,而该质询恰好是“Password:”。

    如果您明确使用Net::SSH::Perl::KeyboardInt,它可能会起作用吗?

    当然,你真的应该设置 RSA 公钥认证。

    【讨论】:

      【解决方案3】:

      您需要禁用 ChallengeResponse 身份验证:

      #!/usr/bin/perl
      use strict;
      use Net::SSH::Perl;
      
      my $user = 'user';
      my $pw = 'pw';
      my $host = 'some.server';
      my $cmd = 'id';
      
      my %params = (
          'debug' => 0,
      );
      
      # get the ssh connection object
      my $ssh = Net::SSH::Perl->new($host, %params);
      # get the configuration object associated with the host connection
      my $cfg = $ssh->config;
      # disable challenge/response authentication
      my $v = $cfg->set('auth_ch_res', 0);
      # set the login parameters
      $ssh->login($user, $pw);
      # issue the command (which is when the authentication actually takes place)
      my($stdout, $stderr, $exit) = $ssh->cmd($cmd);
      # do what you want with the result
      print $stdout;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-06
        • 2016-04-08
        • 2015-08-14
        • 1970-01-01
        • 2012-08-11
        • 2017-07-26
        • 2014-02-28
        • 1970-01-01
        相关资源
        最近更新 更多