我正在使用 net::ssh2 编写一个 perl 脚本来建立与远程服务器的 SSH 连接。(我在窗户上工作)
我选择 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 秒(或者更多,你明白我的意思)