2012-04-10 6 views
1

я не знаю, если мне удалось установить Net::SSH::Perl модуль успешно, но я не могу показаться, чтобы быть в состоянии выполнить следующий код:Как запустить SSH-команды с помощью Net :: SSH :: Perl?

my $ssh = Net::SSH::Perl->new($remote_host); 
$ssh->login($username, $password); 
print "login done", "\n"; 
my ($out, $err, $exit) = $ssh->cmd($cmd); 
print "$out", "\n"; 

Я могу войти в систему, но не может напечатать $out. Я получаю эту ошибку:

Use of uninitialized value $out in string at test_ssh.pl line 28. 

Линия 28 относится к print "$out", "\n";.

Я запускаю этот код на Cygwin. Что мне теперь делать?

EDIT: я получил следующее сообщ об ошибке, когда я побежал my $ssh = Net::SSH::Perl->new($remote_host, options => ["Debug yes"]);:

Use of uninitialized value $out in string at test_ssh.pl line 29 (#1) 
    (W uninitialized) An undefined value was used as if it were already 
    defined. It was interpreted as a "" or a 0, but maybe it was a mistake. 
    To suppress this warning assign a defined value to your variables. 

    To help you figure out what was undefined, perl will try to tell you the 
    name of the variable (if any) that was undefined. In some cases it cannot 
    do this, so it also tells you what operation you used the undefined value 
    in. Note, however, that perl optimizes your program and the operation 
    displayed in the warning may not necessarily appear literally in your 
    program. For example, "that $foo" is usually optimized into "that " 
    . $foo, and the warning will refer to the concatenation (.) operator, 
    even though there is no . in your program. 

EDIT2: Вот мой полный код

use strict; 
use warnings; 
use Net::SSH::Perl; 

my $remote_host = '<host ip address>'; 
my $password = 'pass'; 
my $username = 'user'; 
my $cmd   = 'copy run tftp:<my own ip address>'; 

warn "Starting SSH Services:..."; 
my $ssh = Net::SSH::Perl->new($remote_host, debug => 1); 
print "done", "\n"; 

warn "Starting Login:..."; 
$ssh->login($username, $password); 
print "login done", "\n"; 

warn "Starting command:..."; 
#$ssh->cmd($cmd); 
#my($stdout, $stderr, $exit) = $ssh->cmd($cmd); 
my ($out, $err, $exit) = $ssh->cmd($cmd); 
print "$out", "\n"; 

Сообщение об ошибке на «печать "$ из" "\ п";» линия:

<Computername>: channel 1: new [client-session] 
<Computername>: Requesting channel_open for channel 1. 
<Computername>: Entering interactive session. 
<Computername>: Channel open failure: 1: reason 4: 
Use of uninitialized value $out in string at test_ssh.pl line 29. 

ПОСЛЕДНИЙ EDIT: Я решил использовать Net :: Appliance :: Session для входа через SSH к сетевым устройствам вместо этого. это намного проще в использовании, чем Net :: SSH :: Perl.

+0

Включите отладку с моим $ SSH = Net :: SSH :: Perl-> новый ($ remote_host, опции => [ "Debug да"]); Перед печатью проверьте значение err. Если вы не уверены, покажите нам значение off err и вывод отладки. – weismat

+0

Это "print" $ out "," \ n ";". Я получил то же сообщение об ошибке (за исключением другого номера строки, но ссылаюсь на ту же строку кода) после добавления кода, который вы мне дали. – Sakura

+0

@weismat: это не то, как вы включаете отладку для этого модуля. – Borodin

ответ

1

Просьба отобразить больше кода. Каково значение $cmd?

Обратите внимание, что метод login не выполняет вход в систему: он просто сохраняет имя пользователя и пароль, которые будут использоваться, когда соединение настроено для каждого вызова cmd.

Правильный способ включения отладочных сообщений является

my $ssh = Net::SSH::Perl->new($remote_host, debug => 1); 

Это даст вам информацию трассировки из метода cmd, который должен сказать, среди прочего

Sending command: xxx 
Entering interactive session. 

и должны дать вам некоторые подсказки о том, что происходит не так.


В результате отладки отображается проблема. Глядя на SSH2.h, причина возникновения неисправности 4 равна SSH2_DISCONNECT_HOST_AUTHENTICATION_FAILED. Неверное имя пользователя и пароль.

+0

Я добавил полный код в разделе «EDIT2». – Sakura

+0

Спасибо. Я добавил свой ответ, чтобы объяснить вашу ошибку. Каковы содержимое '$ err' и' $ exit' после вызова? – Borodin

+0

Привет. Я совершенно уверен, что имя пользователя и пароль верны, потому что я использовал одни и те же учетные данные и использовал Net :: SSH и Expect, чтобы закодировать логин, и это не дает мне никакой ошибки. На самом деле ему удалось распечатать приветственное сообщение, когда я успешно вхожу в систему. – Sakura

0

Net :: SSH :: Perl не поддерживает логин через имя пользователя и пароль только с помощью интерактивной записи пароля или открытого ключа. См. Это сообщение для получения дополнительной информации.

http://www.perlmonks.org/?node_id=590452

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