2014-08-28 3 views
2

Я использую Net :: SSH :: Perl для подключения к удаленному серверу и выполнения команд. Проблема в том, что он не истекает, даже если удаленный сервер не отвечает в течение длительного времени. Я не нашел ни одного тайм-аута в Net :: SSH :: Perl.Тайм-аут соединения SSH в сети :: SSH :: Perl

Любая помощь в достижении таймаута оценивается.

Примечание: Я не имею права на изменение Net/SSH/Perl.pm

ответ

3

Используйте ConnectTimeout вариант.

Пример:

use Net::SSH::Perl; 

my %params = (protocol => "2,1", 
       identity_files => ["/home/user/.ssh/test_id_dsa"], 
       options => [ "BatchMode yes", 
           "ConnectTimeout 3", 
           "StrictHostKeyChecking no"], 
       debug => 'true' 
); 

Также см: Net::SSH::Perl ConnectTimeout (ssh -o option)

+0

В соответствии с указанной ссылкой пользователь пытается использовать параметр ConnectTimeout в Net :: SSH :: Perl, и он не работает. Итак, временное решение состоит в том, чтобы добавить setsockopt в Perl.pm. Поскольку у меня нет прав на изменение Perl.pm, я не могу его реализовать. Во всяком случае, для вас работает опция ConnectTimeout? – Hema

+1

Я не тестировал его, поэтому не знаю, работает ли это на моей машине или нет. Я использую Net :: OpenSSH, вы можете попробовать это. Также см. Это: http://stackoverflow.com/a/2851593/257635 –

+0

Даже если этот вариант был реализован в Net :: SSH :: Perl, это не помогло бы автору. Он определяет ConnectTimeout, например. таймаут для установления соединения и то, что хочет автор, на самом деле ServerAliveInterval, который также не реализован в Net :: SSH :: Perl. – afenster

2

Как я вижу из вашего %params, вы используете ключ DSA для проверки подлинности на удаленном сервере. У вас действительно нужно использовать встроенную реализацию Perl SSH, которую Net::SSH::Perl предоставляет? Это полезно в некоторых случаях, когда вы не можете просто обернуть обычный вызов ssh (например, если вам нужно предоставить текстовый пароль для подключения к серверу), но в нем не так много полезных параметров SSH - вы только что нашли один из их.

Я полагаю, что вы пытаетесь использовать Net::SSH вместо (который является очень простой оболочкой для ssh двоичных систем) и дать ему ConnectTimeout и ServerAliveInterval варианты с -o или Net::OpenSSH которых отнесено @ChankeyPathak выше и использовать его check_master метод (как я понимаю из описания, он выглядит так, как вам нужно).

руководства имеет хорошее описание ConnectTimeout (который определяет время ожидания при установлении соединения) и TCPKeepAlive и ServerAliveInterval (который обнаружить таймауты установленного соединения).

Для справки: здесь приведен полный список опций, реализованных в Net::SSH::Perl, и с его Config.pm. Если вам нужно использовать любой другой параметр, не указанный здесь, используйте какой-либо другой модуль SSH.

BindAddress 
Host 
BatchMode 
ChallengeResponseAuthentication 
Cipher 
Ciphers 
Compression 
CompressionLevel 
DSAAuthentication 
GlobalKnownHostsFile 
HostKeyAlgorithms 
HostName 
IdentityFile 
NumberOfPasswordPrompts 
PasswordAuthentication 
PasswordPromptHost 
PasswordPromptLogin 
Port 
Protocol 
RhostsAuthentication 
RhostsRSAAuthentication 
RSAAuthentication 
StrictHostKeyChecking 
UsePrivilegedPort 
User 
UserKnownHostsFile 
1

У меня была аналогичная проблема. Я выполнял команду, которая не прекращалась по какой-либо причине. Поэтому я завернул вызов $ ssh-> cmd в eval с сигналом тревоги, как описано в perldoc -f alarm. Не самое приятное решение, но единственный вариант, поскольку я не могу изменить команду, которую я вызывал.

Смежные вопросы