1

(async => 1) オプションを使用して Openssh モジュールを使用してホストに接続しています。接続できないホストの接続エラーをトラップするにはどうすればよいですか。最終的にすべてのデータを cgi としてフォーマットしたいので、エラーを端末に表示するのではなく、データ構造に保存したいと考えています。スクリプトを実行すると、接続に問題があるホストがターミナルでエラーをスローします。コードはさらに実行され、切断されたホストでコマンドを実行しようとします。切断されたホストを分離したいと考えています。

my (%ssh, %ls);        #Code copied from CPAN Net::OpenSSH
my @hosts = qw(host1 host2 host3 host4 );
 # multiple connections are stablished in parallel:
  for my $host (@hosts) {
  $ssh{$host} = Net::OpenSSH->new($host, async => 1); 
  $ssh{$host}->error and die "no remote connection "; <--- doesn't work here! :-(  
  }
# then to run some command in all the hosts (sequentially):
 for my $host (@hosts) {
 $ssh{$host}->system('ls /');
}

$ssh{$host}-> エラーが発生し、「リモート接続が機能しません」と終了します。

どんな助けでも大歓迎です。ありがとう

4

1 に答える 1

1

非同期接続を実行します。したがって、プログラムは作業を継続し、接続が確立されるのを待ちません。新しいasyncオプションを使用した後、エラーをチェックしようとしますが、接続が進行中であり、エラーに関する情報がないため、エラーは定義されていません。

私が理解しているように、最初のループの後、接続プロセスが結果を得るまで待つ必要があります。

->wait_for_master(0); を使用してみてください。

false の値が指定された場合、接続プロセスを終了し、多重化ソケットが使用可能になるまで待機します。

接続が正常に確立されると、true 値が返されます。接続プロセスが失敗した場合、または接続プロセスがまだ完了していない場合は、False が返されます (この場合、「エラー」メソッドを使用して両方のケースを区別できます)。

for my $host (@hosts) {
    $ssh{$host} = Net::OpenSSH->new($host, async => 1); 
}

for my $host (@hosts) {
    unless ($ssh{$host}->wait_for_master(0)) {
        # check $ssh{$host}->error  here. For example delete $ssh{$host}
    }
}

# Do work here

このコードはチェックしません。

PS: 私の英語で申し訳ありません。お役に立てば幸いです。

于 2013-02-21T16:07:20.817 に答える