我正在使用net :: ssh2编写一个perl脚本来建立到远程服务器的SSH连接.
(我在
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)”时,脚本成功结束.
问题是,我不能写“睡觉(10)”(我不知道是否需要9或11秒(或更多,你看到我的观点)
最佳答案 您可以尝试使用
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.
请注意,我刚刚上传到CPAN的版本0.03上添加了SFTP支持(通过Net :: SFTP :: Foreign).