Проблема в Net::SSH::Perl с Cisco

Итак, сразу к делу.

Самый простой скрипт для соединения с Cisco выглядит примерно так:

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

$user = 'robot';
$pass = 'password123';
$host="r1.local.ru";
$ssh = Net::SSH::Perl->new($host,protocol => '2', cipher=>'3des-cbc', debug =>'1', interactive => '0');
$ssh->login($user,$pass,0)
$ssh->shell;
#или так
#$cmd = "sh run";
#eval $ssh->cmd($cmd);

Однако если использовать версию протокола SSH v1 (protocol => '1') тогда всё запускается и работает, однако с версией SSH-2 (protocol => '2') выкидывает в ошибку:

...
serverbox.ru: Next method to try is password.
serverbox.ru: Trying password authentication.
serverbox.ru: Login completed, opening dummy shell channel.
serverbox.ru: channel 0: new [client-session]
serverbox.ru: Requesting channel_open for channel 0.
serverbox.ru: channel 0: open confirm rwindow 1024 rmax 4096
serverbox.ru: Got channel open confirmation, requesting shell.
serverbox.ru: Requesting service shell on channel 0.
serverbox.ru: channel 1: new [client-session]
serverbox.ru: Requesting channel_open for channel 1.
serverbox.ru: Entering interactive session.
serverbox.ru: Channel open failure: 1: reason 4:

Т.е. тут происходит открытие нескольких логических сессий (каналов) в одной сессии - это особенность ssh-2 в отличии от ssh-1.

Клиент пытается создать новый канал и передает сообщение, содержащее выделенный номер канала и размер окна.

Удаленная сторона принимает решение о создании канала и возвращает сообщение о согласии (SSH_MSG_CHANNEL_OPEN_CONFIRMATION) или отказе (SSH_MSG_CHANNEL_OPEN_FAILURE), как написано в "RFC 4254 The Secure Shell (SSH) Connection Protocol".
В нашем случае циска отвергла создание логической сессии (второго потока).
Надо бы разрешить на циске коннекты в несколько потоков, т.е. в одной сессии разрешить несколько логических сессий.
Однако в Cisco с целью безопасности, а именно чтобы нельзя было пробрасывать ssh туннели запретили эту функцию.
На форумах очень много разной информации: и как в один поток всё положить, и как включить многопотоковость в Cisco и т.п., но ничего это не работает.

Однако решение как оказалось очень простое, а это использовать модуль Net::SSH2::Cisco

#!/usr/bin/perl
use Net::SSH2::Cisco;

$user = 'robot';
$pass = 'password123';
$host="r1.local.ru";
my $ssh = Net::SSH2::Cisco->new(host => $host);
$ssh->login($user,$pass);
$ssh->cmd('show version');

После запуска получаем ответ:

Cisco IOS Software, C2960S Software (C2960S-UNIVERSALK9-M), Version 12.2(55)SE7, RELEASE SOFTWARE (fc1)
echnical Support: http://www.cisco.com/techsupport
opyright (c) 1986-2013 by Cisco Systems, Inc.
ompiled Mon 28-Jan-13 10:28 by prod_rel_team
mage text-base: 0x00003000, data-base: 0x01B00000
.....

 

 

Обновлено 07.04.2016 18:48

unix-way