2

我在 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 时,脚本不会终止并且它会连续执行。

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

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

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

4

2 回答 2

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);
...
于 2012-11-23T14:51:12.697 回答
2

如果您需要使用 expect 模块使 ssh 连接取决于 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 -zTCP 端口是否打开

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

use Net::OpenSSH;

my $ssh = Net::OpenSSH->new($host);
$ssh->error and
   die "Couldn't establish SSH connection: ". $ssh->error;
于 2012-11-23T12:14:44.223 回答