1

からの読み取りで<$chan>空のリストが得られるようで、主に遅延の大きいネットワーク上のホストで発生します。リモートホストと対話するより堅牢な方法はありますか?

use Net::SSH2;

# my $ssh = Net::SSH2->new();
# ...

my $chan = $ssh->channel() or die "no channel\n";
$chan->blocking(1); # even worse with $chan->blocking(0);
$chan->shell();

print $chan "ps -ef\n";
print <$chan>;

編集:

使用時のエラーNet::SSH::Any

lib/Net/SSH/Any/Backend/Net_SSH2.pm の 133 行目の未定義の値に対してメソッド「exec」を呼び出すことはできません。

sub _capture {
    my ($any, $opts, $cmd) = @_;
    my $ssh2 = $any->{be_ssh2} or return;
    my $channel = $ssh2->channel;
    my ($out_fh, $err_fh) = __parse_fh_opts($any, $opts, $channel) or return;
    $out_fh and die 'Internal error: $out_fh is not undef';

    # vvvvvvvvvvvvvv
    $channel->exec($cmd); # <--- LINE 133
    # ^^^^^^^^^^^^^^

    (__io3($any, $ssh2, $channel, $opts->{stdin_data}, undef, $err_fh || \*STDERR))[0];
}
4

1 に答える 1

1

Net::SSH::Anyを使用してください。

数日前、私が話していた 2 つの問題を修正したバージョン 0.04 をリリースしました。

  • への未チェックの呼び出しchannel
  • Net::SSH2バックエンドでのタイムアウトのサポート。OpenSSHもlibssh2もリモートプロセスを終了するためにシグナルを送信することをサポートしていないため、まだ完全ではありません。そのため、モジュールはstdioストリームを閉じ、リモートプログラムが次に書き込みを試みるときに最終的にSIGPIPEを受信することを期待します.
于 2013-09-27T09:18:56.897 に答える