[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.