2

私はperlでexpectを使用してsshを実行します。以下は、私のコードsnipetです。

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を使用して決定を下すのは正しい方法ですか?

もう1つ疑問があります。宛先IPに到達できない場合、制御が期待から外れる理由は、「$ exp-> expected(undef、'renjithp>');」を意味します。プロンプトが正しく表示された後にのみ戻る必要がありますか?

4

2 に答える 2

2

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 -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 に答える
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 に答える