【问题标题】:Perl ssh error handling when host not reachable主机不可访问时的 Perl ssh 错误处理
【发布时间】:2012-11-23 11:53:09
【问题描述】:

我在 perl 中使用 expect 来做 ssh,下面是我的代码片段。

my $exp = Expect->spawn("ssh renjithp\@192.168.1.12") or die "could not spawn ssh";
my $op = $exp->expect(undef,'renjithp>');
print "*$op*";

如果主机无法访问(目标 IP 已关闭),我想处理错误,我的印象是当 ip 无法访问时会发生死机,但是当我给出错误的 IP 时脚本不会终止并且它持续执行。

处理这种情况的正确方法是什么?

已编辑 我观察到当 ssh 成功时 $op 值为 1,当目标 IP 未启动时为 0。使用 $op 做出决定是否正确?

我还有一个疑问,当无法访问目标 IP 时,为什么控制超出预期,我的意思是 '$exp->expect(undef,'renjithp>');'应该只有在得到正确提示后才返回?

【问题讨论】:

  • 可能不是您想要的答案,但是在我工作的一个地方,我们最终在类似的场景中放弃了 Expect 模块,而是使用带有脚本的命令行 expect 。也许从那以后它有所改善。
  • 我想我明白了期望回报的原因。 **当 IP 无法访问时,ssh 的衍生进程将终止,这将导致预期关闭。为了验证这一点,我采用了一个成功的案例,我将语句 $exp->expect 用于不期望的东西,现在控制在这一点上被阻止。当我从不同的终端杀死 SSH 进程时,阻塞期望的控制就出来了。所以我觉得我可以使用 $op 来验证 ssh 是否成功。

标签: perl networking ssh expect


【解决方案1】:

如果您需要使 ssh 连接取决于使用 expect 模块的 IP 地址可访问性,您应该首先使用 nc 测试连接性...

my $addr = "192.168.1.12";
if (system("nc -w 1 -z $addr 22")==0) {
    my $exp = Expect->spawn("ssh renjithp\@$addr") or die "could not spawn ssh";
    my $op = $exp->expect(undef,'renjithp>');
    print "*$op*";
} else {
    print "Host $addr is unreachable\n";
}

nc 命令是 netcat...nc -z 测试 TCP 端口是否打开

或者,您可以使用像 Net::OpenSSH 这样的模块,它可以让错误处理更容易一些...

use Net::OpenSSH;

my $ssh = Net::OpenSSH->new($host);
$ssh->error and
   die "Couldn't establish SSH connection: ". $ssh->error;

【讨论】:

  • 好的,感谢您的解决方案。如果服务未运行,IP 已启动但 ssh 服务未运行,有什么方法可以与 ping 一起检查?
  • 您可以使用nc -z $addr 22 来测试TCP 端口是否打开...从技术上讲,您可以简单地使用nc 命令来测试两者...
【解决方案2】:

使用 Net::OpenSSH:

use Net::OpenSSH;

my $ssh = Net::OpenSSH->new($host, timeout => 30);
if ($ssh->error) {
    die "Unable to connect to remote host: " . $ssh->error;
}
my $out = $ssh->capture($cmd);
...

【讨论】:

  • 这是一个不错的选择,但我不能使用 OpenSSH,因为它没有安装在它打算使用的目标机器上。
  • @Renjith:您只需将它安装在运行脚本的机器上,而不需要安装在目标机器上。在任何情况下,安装 Net::OpenSSH 都非常简单,只需从 perl @INC 可访问的某个位置复制分发中的 lib 目录的内容。
  • 'target machine' 我的意思是说,我的脚本最终用在了哪里。有很多这样的机器,如果我想安装一些东西,我必须遵循正确的程序。这不是不可能的事情,而是一些额外的步骤,让我看看。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多