gpt4 book ai didi

perl - [Perl][net::ssh2] 如何在执行远程命令时保持 ssh 连接

转载 作者:行者123 更新时间:2023-12-01 04:01:05 25 4
gpt4 key购买 nike

我正在使用 net::ssh2 编写 perl 脚本以建立到远程服务器的 SSH 连接。
(我在 window 上工作)

我选择 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 秒(或更多,你明白我的意思)

最佳答案

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

关于perl - [Perl][net::ssh2] 如何在执行远程命令时保持 ssh 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13457178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com