2009-08-31 3 views
1

Я использую Net :: SSH :: Perl для выполнения команды на удаленном сервере следующим образом:Почему ssh подсказывает мне пароль после того, как я передаю его в Perl Net :: SSH :: Perl?

use Net::SSH::Perl; 
my $ssh = Net::SSH::Perl->new($host); 
$ssh->login($user, $pass); 
my ($stdout, $stderr, $exit) = $ssh->cmd($cmd); 

Но когда я исполню выше сценарий, будет предложено ввести пароль снова приходит. Значение пароля, который я поставил в $ pass, не принимается, чтобы установить ssh-соединение. Почему это? Любая идея, как я могу это преодолеть? Я даю ниже отладочной информации:

serv1: Reading configuration data /root/.ssh/config 
serv1: Reading configuration data /etc/ssh_config 
serv1: Allocated local port 1023. 
serv1: Connecting to 15.154.59.63, port 22. 
serv1: Remote protocol version 1.99, remote software version OpenSSH_4.2 
serv1: Net::SSH::Perl Version 1.34, protocol version 1.5. 
serv1: No compat match: OpenSSH_4.2. 
serv1: Connection established. 
serv1: Waiting for server public key. 
serv1: Received server public key (768 bits) and host key (1024 bits). 
serv1: Host '15.154.59.63' is known and matches the host key. 
serv1: Encryption type: DES3 
serv1: Sent encrypted session key. 
serv1: Received encryption confirmation. 
serv1: RSA authentication failed: Can't load public key. 
serv1: Doing challenge response authentication. 
Password:

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

UPDATE (На основании полученных замечаний):

Я попробовал следующее:

my $ssh = Net::SSH::Perl->new($host, debug =>1, identity_files => []); 

Теперь я не получаю сообщение «аутентификации RSA не удалось:» но все-таки появляется запрос на ввод пароля , Ниже приводится информация об отладке:

serv1: Allocated local port 1023. 
serv1: Connecting to 15.154.59.63, port 22. 
serv1: Remote protocol version 1.99, remote software version OpenSSH_4.2 
serv1: Net::SSH::Perl Version 1.34, protocol version 1.5. 
serv1: No compat match: OpenSSH_4.2. kf-linux-dm3: Connection established. 
serv1: Waiting for server public key. 
serv1: Received server public key (768 bits) and host key (1024 bits). 
serv1: Host '15.154.59.63' is known and matches the host key. 
serv1: Encryption type: DES3 
serv1: Sent encrypted session key. 
serv1: Received encryption confirmation. 
serv1: Doing challenge response authentication. 
Password:

Может кто-нибудь просветить меня?

ответ

5

Эта линия в ваших ошибках:

serv1: RSA authentication failed: Can't load public key.

говорит мне, что ваша программа пытается сделать automatic logins, который не то, что вы хотите делать, когда вам нужен пароль, чтобы войти

Проверить. the Perl/ssh documentation:

identity_files

A list of RSA/DSA identity files to be used in RSA/DSA authentication. The value of this argument should be a reference to an array of strings, each string identifying the location of an identity file. Each identity file will be tested against the server until the client finds one that authenticates successfully.

If you don't provide this, RSA authentication defaults to using $ENV{HOME}/.ssh/identity, and DSA authentication defaults to $ENV{HOME}/.ssh/id_dsa.

Вы можете попробовать установить identity_files пустой массив, чтобы увидеть, если это заставляет его использовать свои поставленные па меч; или вы можете пойти дальше и настроить аутентификацию с открытым ключом, как в приведенной выше ссылке.

+0

Установка identity_files в пустой массив не помогло :(запрос пароля по-прежнему идет вверх.Если я даю путь для файла ключей rsa, я получаю следующую ошибку: «Невозможно использовать строку (« /root/.ssh/id_rsa.pub ») как ARRAY ref, а« строгие ссылки »используются в/usr/lib/perl5/site_perl/5.8.8/Net/SSH/Perl/Auth/RSA.pm строка 40. " Любая идея, почему это происходит? – Ninja

+0

@Ninja: убедитесь, что вы поставляете * reference * в массив, а не только массив. –

+0

@ Адам: Я передаю только ссылку, и она не работает. Ниже приводится фрагмент кода: @arr = (""); my $ ssh = Net :: SSH :: Perl-> new ($ host, debug => 1, identity_files => \ @arr); Если я установил identity_files в пустой массив, как предложил Марк, я получаю то же сообщение «Ошибка аутентификации RSA: невозможно загрузить открытый ключ». и затем появится запрос пароля. Кто-то pl. Помоги мне. – Ninja

1

serv1: Doing challenge response authentication.

Это ваша ключевая линия. SSH фактически имеет несколько типов парольной аутентификации. Одна из них - проверка подлинности паролей (контролируется опцией PasswordAuthentication в /etc/sshd_config), я подозреваю, что это то, за что вы отправили $pass. Другой - challenge-response authentication, где сервер отправляет одну или несколько проблем, и от вас ожидается ответ с правильными ответами. Ref и Spec.

Итак, технически, ssh не просит вас ввести пароль. Он просит вас ответить на произвольный вызов с сервера, и эта проблема просто оказывается «Password:».

Возможно, это сработает, если вы используете явно Net::SSH::Perl::KeyboardInt?

Конечно, вы действительно должны настроить аутентификацию открытого ключа RSA.

0

Вам нужно отключить проверку подлинности ChallengeResponse:

#!/usr/bin/perl 
use strict; 
use Net::SSH::Perl; 

my $user = 'user'; 
my $pw = 'pw'; 
my $host = 'some.server'; 
my $cmd = 'id'; 

my %params = (
    'debug' => 0, 
); 

# get the ssh connection object 
my $ssh = Net::SSH::Perl->new($host, %params); 
# get the configuration object associated with the host connection 
my $cfg = $ssh->config; 
# disable challenge/response authentication 
my $v = $cfg->set('auth_ch_res', 0); 
# set the login parameters 
$ssh->login($user, $pw); 
# issue the command (which is when the authentication actually takes place) 
my($stdout, $stderr, $exit) = $ssh->cmd($cmd); 
# do what you want with the result 
print $stdout; 
Смежные вопросы