【问题标题】:can't ssh:unable to establish master SSH connection: bad password or master process exited unexpectedly无法 ssh:无法建立主 SSH 连接:密码错误或主进程意外退出
【发布时间】:2014-06-29 14:43:13
【问题描述】:

我的 perl 模块有问题,我正在尝试使用 CPAN 中的 OpenSSH 模块连接到远程服务器,并且我已正确提供了用户名和密码,但是当我从浏览器运行 CGI 时,我看到以下错误消息“

无法 ssh:无法建立主 SSH 连接:密码错误或 主进程意外退出

需要立即回复并等待, 提前致谢。

这是我的代码

#!/usr/bin/perl -w
use CGI;
use Data::Dumper;
use strict;
use CGI::Carp qw(fatalsToBrowser);
use Net::OpenSSH;


my $query = CGI->new();
#my $mach_name=$query->param('mach_name');
my $mach_name= '****.cce.***.com';
my $user='root';
my $passwd='*******';
my $ssh = Net::OpenSSH->new("$mach_name",user => "$user" , passwd => "$passwd
", master_opts => [-o => "strictHostKeyChecking=no"]);
$ssh->error and die "can't ssh:" . $ssh->error;
my $mem_info =$ssh->capture("ioscan -m lun");
print "$mem_info";
print "Content-type: text/html\n\n";
print "<html><head><title>test page</title></head>\n";
print "<body><p>Dicovering Machine Please wait....</p>\n";
print "<p>$mach_name</p>";
print "<p><b>Swap Memory :$mem_info </b> </p>";
print "</body></html>";

如果我通过命令行运行相同的程序,它会获取 o/p,但通过浏览器我看到了上述错误,我已正确输入密码和用户名

【问题讨论】:

  • 遵循模块文档中的故障排除部分

标签: perl perl-module mod-perl


【解决方案1】:

当我将超时时间从 10 秒增加到 15 秒时,我的问题得到了解决,因为设备使用的是旧的 SSH 守护程序版本,但是我建立客户端连接的 linux 服务器已升级,当然它首先会探测较新的密码。

my $ssh = Net::OpenSSH->new(
$host,
port                => $port,
user                => $user,
password            => $pass,
timeout             => 15,       # <= this was 10 and now is 15
kill_ssh_on_timeout => 1,
strict_mode         => 0,
master_opts         => [-o => "StrictHostKeyChecking=no", '-vvv'], #<= -vvv helped much
ctl_dir             =>'/tmp/libnet-openssh-perl',

【讨论】:

    【解决方案2】:

    看起来像是一些权限问题。在verbose mode 中运行ssh

    my $ssh = Net::OpenSSH->new("$mach_name",
                                 user => "$user", 
                                 passwd => "$passwd",
                                 master_opts => '-vvv',
                                 master_stderr_fh => \*LOG);
    

    如果这没有为您提供有关问题原因的足够信息,那么您可以使用truss 查看操作系统级别发生的情况。

    同时检查.ssh/known_hosts,确保.ssh 目录可由Apache 写入。 .libnet-openssh-perl 目录应该是 Apache 可写的。

    例如,我的 Apache 用户是 apache,主目录为 /var/www 我有apache 拥有的/var/www/.sshapache 拥有的/var/www/.libnet-openssh-perl。我使用自己的帐户 SSH 到设备,然后将我的 known_hosts 文件复制到 /var/www/.ssh/known_hosts

    【讨论】:

    • open_ex: ['ssh','-O','check','-T','-S','/.libnet-openssh-perl/root-k8sn1.cce.hp .co-29356-315770','-l','root','k8sn1.cce.hp.com','--'] # _waitpid(29359) => pid: 29359, rc: 中断的系统调用 # open_ex : ['ssh','-S','/.libnet-openssh-perl/root-k8sn1.cce.hp.co-29356-315770','-l','root','k8sn1.cce.hp .com','--','ioscan -m lun'] # _waitpid(29360) => pid: 29360, rc: Interrupted system call 这是我在调试模式下看到的,我看到最后一列是空而我虽然 null 正在传递并试图删除 passwd 并执行 cgi 但没有响应并且看不到错误..任何 i/p.?
    • 我已经删除了目标机器的密码并尝试执行,然后我看不到任何响应。
    • 嗨,它拥有各种权限,任何人都可以解决这个问题,它阻碍了我的工作。
    猜你喜欢
    • 2016-06-14
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    相关资源
    最近更新 更多