Удалось ли кому-нибудь реализовать управление коммутаторами из perl-скриптов посредством ssh? Допустим, нужно выполнить серию команд на нескольких коммутаторах. Начнем с модуля Net::SSH::Perl с протоколом 1:
Код:
#!/usr/bin/perl -wl
use Net::SSH::Perl;
print "connect";
my $ssh = Net::SSH::Perl->new("10.1.1.1", privileged=>"no",debug=>1,protocol=>1);
print "login";
$ssh->login('root','pass');
print "execute";
($out, $err, $exit) = $ssh->cmd("help");
print "OUT:$out","ERR: $err","EXIT: $exit";
Результат:
Код:
[root@ffactory metalsoft]# ./switches_ssh.pl
connect
ffactory.mydomain: Reading configuration data /root/.ssh/config
ffactory.mydomain: Reading configuration data /etc/ssh_config
ffactory.mydomain: Allocated local port 1023.
ffactory.mydomain: Connecting to 10.1.1.1, port 22.
ffactory.mydomain: Remote version string: SSH-2.0-DLINK Corp. SSH server ver 1.00.000
ffactory.mydomain: Remote protocol version 2.0, remote software version DLINK Corp. SSH server ver 1.00.000
Use of uninitialized value in numeric eq (==) at /usr/lib/perl5/vendor_perl/Net/SSH/Perl.pm line 330.
Use of uninitialized value in numeric eq (==) at /usr/lib/perl5/vendor_perl/Net/SSH/Perl.pm line 52.
ffactory.mydomain: Net::SSH::Perl Version 1.30, protocol version 1.5.
ffactory.mydomain: No compat match: DLINK Corp. SSH server ver 1.00.000.
ffactory.mydomain: Connection established.
login
exec
ffactory.mydomain: Waiting for server public key.
Use of uninitialized value in numeric eq (==) at /usr/lib/perl5/vendor_perl/Net/SSH/Perl/Packet.pm line 70.
Use of uninitialized value in numeric eq (==) at /usr/lib/perl5/vendor_perl/Net/SSH/Perl.pm line 370.
Use of uninitialized value in numeric eq (==) at /usr/lib/perl5/vendor_perl/Net/SSH/Perl/Packet.pm line 70.
Connection closed by remote host. at /usr/lib/perl5/vendor_perl/Net/SSH/Perl/SSH1.pm line 75
[root@ffactory metalsoft]#
Тот же модуль, тот же скрипт, но protocol=>2:
Код:
[root@ffactory metalsoft]# ./switches_ssh.pl
connect
ffactory.mydomain: Reading configuration data /root/.ssh/config
ffactory.mydomain: Reading configuration data /etc/ssh_config
ffactory.mydomain: Allocated local port 1023.
ffactory.mydomain: Connecting to 10.1.1.1, port 22.
ffactory.mydomain: Remote version string: SSH-2.0-DLINK Corp. SSH server ver 1.00.000
ffactory.mydomain: Remote protocol version 2.0, remote software version DLINK Corp. SSH server ver 1.00.000
Math::BigInt: couldn't load specified math lib(s), fallback to Math::BigInt::FastCalc at /usr/lib/perl5/vendor_perl/Crypt/DH.pm line 6
ffactory.mydomain: Net::SSH::Perl Version 1.30, protocol version 2.0.
ffactory.mydomain: No compat match: DLINK Corp. SSH server ver 1.00.000.
ffactory.mydomain: Connection established.
login
ffactory.mydomain: Sent key-exchange init (KEXINIT), wait response.
ffactory.mydomain: Algorithms, c->s: 3des-cbc hmac-sha1 none
ffactory.mydomain: Algorithms, s->c: 3des-cbc hmac-sha1 none
ffactory.mydomain: Entering Diffie-Hellman Group 1 key exchange.
[root@ffactory metalsoft]#
Пробуем другие модули, на другой ОС, на другом хосте: Net::SSH не поддерживает авторизацию по паролю (только через ключи. Поправьте, если ошибаюсь). Пробуем Net::SSH2:
Код:
#!/usr/bin/perl -wl
use Net::SSH2;
my $ssh2 = Net::SSH2->new();
$ssh2->connect('10.1.1.1') or die "Unable to connect\n";
$ssh2->auth_password('root','pass') or die "Unable to login\n";
my $chan = $ssh2->channel();
$chan->exec('help');
while (<$chan>){ print };
В результате получаем :
Код:
metalsoft@metalsoft:~/scripts$ ./perl_ssh_switch.pl
metalsoft@metalsoft:~/scripts$
Пробовал на моделях 3526, 3528 и даже 3627. Результата не добился нигде. Причем все результаты точно такие же, если указать неправильный пароль. В логах коммутаторов нет даже сообщений о попытках логина по ssh. Доступ по ssh на коммутаторы из bash, ессно, есть. Если в тех же скриптах поменять ip на какой-нибудь nix-сервер, все работает.