私は、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 秒かかるかわかりません (またはそれ以上、私の要点がわかります))。