4

私は、net::ssh2 を使用してリモート サーバーへの SSH 接続を確立するための perl スクリプトに取り組んでいます。(私はWindowsで作業しています)

Net::SSH2 を選択したのは、同じスクリプトでいくつかの SFTP 接続を確立する必要があったためです。

今のところ、私の sftp 接続は完全に機能しています。問題は、「長時間」コマンドを実行しようとしたときです。実行に30秒以上かかるコマンドを意味します。

    $ssh2 = Net::SSH2->new();
    $ssh2->connect('HOST') or die;
    if($ssh2->auth(username=>'USER', password=>'PSWD'))
    {
        $sftp = Net::SFTP::Foreign->new(ssh2=>$ssh2, backend=>'Net_SSH2');
        $sftp->put('local_path', 'remote_path');
        $channel=$ssh2->channel();
    ##
        $channel->shell('BCP_COMMAND_OR_OTHER_PERL_SCRIPT');
    # OR (I tried both, both failed :( )
        $channel->exec('BCP_COMMAND_OR_OTHER_PERL_SCRIPT');
    ##
        $channel->wait_closed();
        $channel->close();
        print "End of command";
        $sftp_disconnect();
    }
    $ssh2->disconnect();

このスクリプトを実行すると、接続は成功し、ファイルは正しく送信されますが、実行は (完全に) 実行されません。つまり、コマンドは実行のために送信されたが、すぐに終了したか、まったく送信されなかったと思います。よくわかりません。

私が欲しいのは、すべてを切断する前に、コマンドが完全に終了するまでスクリプトが待機することです(コマンド実行の結果を取得する必要がある場合があるため)

これを解決する方法を知っている人はいますか?:( cpanのドキュメントはこれについてあまり明示的ではありません

ありがとう!

PS: 私はどんな意見や提案にもオープンです :)

編集:いくつかのテストの後、コマンドは送信されましたが中断されたと言えます。私のテストは、リモート サーバーで別の perl スクリプトを開始することでした。このスクリプトは、フラット ファイルに書き込みます。このテストでは、スクリプトが開始され、ファイルは半分埋められています。つまり、ファイルは残酷に途中で停止します。

一方、「$channel->exec()」の直後に「sleep(10)」を実行すると、スクリプトは正常に終了します。問題は、「sleep(10)」を記述できないことです (9 秒か 11 秒かかるかわかりません (またはそれ以上、私の要点がわかります))。

4

1 に答える 1

2

代わりにNet::SSH::Anyを使用してみてください。

より高度で使いやすい API を提供し、Net::SSH2 または Net::OpenSSH を使用して SSH 接続を処理できます。

例えば:

use Net::SSH::Any;

my $ssh = Net::SSH::Any->new($host, user => $user, password => $password);
$ssh->error and die $ssh->error;

my $sftp = $ssh->sftp;
$sftp->put('local_path', 'remote_path');

my $output = $ssh->capture($cmd);
print "command $cmd output:\n$output\n\n";

$sftp->put('local_path1', 'remote_path1');

# no need to explicitly disconnect, connections will be closed when
# both $sftp and $ssh go out of scope.

SFTP サポート (Net::SFTP::Foreign 経由) は、CPAN にアップロードしたばかりのバージョン 0.03 に追加されていることに注意してください。

于 2012-11-19T21:58:48.190 に答える