[Perl][net::ssh2] Как сохранить соединение ssh при выполнении удаленной команды

Я работаю над сценарием perl, используя net::ssh2, чтобы установить SSH-соединение с удаленным сервером. (Я работаю над окнами)

Я выбрал Net::SSH2, потому что мне нужно было сделать несколько SFTP-соединений в том же скрипте.

На данный момент мои соединения sftp работают отлично. Проблема в том, когда я пытаюсь выполнить команду "long-duration". Я имею в виду команду, выполнение которой может занять более 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: я открыт для любых замечаний или предложений:)

Редактировать: После некоторого теста я могу сказать, что команда отправлена, но прервана. Мой тест состоял в том, чтобы запустить другой скрипт на удаленном сервере. Этот скрипт пишет в плоский файл. В этом тесте скрипт запускается, файл наполовину заполнен. Я имею в виду, файл жестоко остановлен в середине.

С другой стороны, когда я выполнил "sleep(10)" сразу после "$channel->exec()", скрипт успешно завершается. Проблема в том, что я не могу написать "сон (10)" (я не знаю, займет ли это 9 или 11 секунд (или больше, вы понимаете, моя точка зрения)

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.

Обратите внимание, что поддержка SFTP (через Net::SFTP::Foreign) была добавлена ​​в версии 0.03, которую я только что загрузил в CPAN.

Другие вопросы по тегам