【问题标题】:[Perl][net::ssh2] How to keep the ssh connection while executing remote command[Perl][net::ssh2] 执行远程命令时如何保持 ssh 连接
【发布时间】:2012-11-07 13:46:56
【问题描述】:

我正在编写一个 perl 脚本,使用 net::ssh2 与远程服务器建立 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)”时,脚本成功结束。 问题是,我不能写“sleep(10)”(我不知道它需要 9 秒还是 11 秒(或者更多,你明白我的意思)

【问题讨论】:

    标签: perl


    【解决方案1】:

    您可以尝试改用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)。

    【讨论】:

    • 谢谢!它完美地工作!我希望这个包的文档会很快增长
    • nohup 用例不同:它允许命令在后台运行,完全脱离 SSH 会话,然后可以关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多