在 Perl 的 ssh 连接中捕获错误主机名的错误消息(使用 Net::OpenSSH)

Posted

技术标签:

【中文标题】在 Perl 的 ssh 连接中捕获错误主机名的错误消息(使用 Net::OpenSSH)【英文标题】:Capture error message for a wrong hostname in ssh connection in Perl (using Net::OpenSSH) 【发布时间】:2015-01-08 01:33:24 【问题描述】:

我正在使用 Net::OpenSSH 模块通过 ssh 密钥身份验证建立 ssh 连接。

my $ssh_handle = Net::OpenSSH->new(user_id@host_name)

我正在尝试捕获在 ssh 连接尝试期间可能发生的不同异常情况。我为此使用 Try::Tiny。

特别是,我试图捕捉在参数中传递了错误的主机名/IP 地址的情况。 在这种情况下,Net::OpenSSH 模块在控制台中抛出以下错误“ssh: Could not resolve hostname x.x.x.: Name or service not known”。

我知道 $ssh_handle->error 给出了错误信息(如果有任何错误) 连接尝试后。但在主机名/IP 错误的情况下,它会包含一条通用消息“无法建立主 SSH 连接:主进程意外退出”。 我相信这是许多错误场景的常见错误消息。所以我不能确定“错误的主机名”错误。

有什么方法可以捕获错误字符串“ssh: Could not resolve hostname x.x.x.: Name or service not known”?

【问题讨论】:

【参考方案1】:

将主 SSH 标准错误流重定向到某个文件并在之后查阅:

# untested!
open my $ssherr_fh, '>', 'openssh-err.log' or die $!;
my $ssh = Net::OpenSSH->new(user_id@host_name,
                            master_stderr_fh => $ssherr_fh);

if ($ssh->error) 
  open my $f, '<', 'openssh-err.log';
  my @err = <$f>;
  print "ssh failed:\n@err\n";

【讨论】:

以上是关于在 Perl 的 ssh 连接中捕获错误主机名的错误消息(使用 Net::OpenSSH)的主要内容,如果未能解决你的问题,请参考以下文章

在 AFNetworking 中找不到具有指定主机名的服务器

如何在perl中绑定表名的值?

如何在 Perl 子例程中处理已捕获和未捕获的错误?

如何在 ubuntu 终端的共享主机中连接 SSH 服务器?

ssh:连接到主机 ssh.github.com 端口 443:连接被拒绝

SSH - 对等方重置连接 - Linux 主机