Я пытаюсь подключиться к коммутатору Cisco по ssh с помощью модуля Perl Net :: Appliance :: Session но я столкнулся с проблемой из-за характера ожидаемого приглашения. Приглашение к переключению выглядит следующим образом
Имя пользователя:
поэтому, когда ожидается основное приглашение для имени пользователя, оно не возвращается должным образом. Глядя на документацию для Net :: Appliance :: Session он говорит о настраиваемых подсказках, но я не уверен, как это реализовать. Имеется в виду разговорник.
Если у кого-то есть примеры того, как это может быть достигнуто, мы будем очень признательны.
Чтобы избежать перекрестной публикации, вчера я задал аналогичный вопрос на perlmonks, вот ссылка на эту ветку http://perlmonks.com/?node_id=1199230
Заранее спасибо.
Пример кода ---
#!/usr/bin/perl
use warnings;
use strict;
use Net::Appliance::Session;
my $host = '<my_host>';
my $user = '<my_user>';
my $pass = '<my_password>';
my $session = Net::Appliance::Session->new( personality => 'cisco', host => $host, transport => 'SSH', );
$session->connect( username => $user, password => $pass ) or die "Cannot Connect! : $!";
my @output = $session->cmd('show version');
$session->close;
print join("\n",@output);
Я изменил свой код, чтобы использовать собственный разговорник, как описано Net :: CLI :: Interact :: Разговорник
Файл моего разговорника выглядит так:
prompt user
match /[Uu]ser\s*[Nn]ame:\s*?$/
prompt pass
match /[Pp]assword: ?$/
prompt prompt
match / ?$/
prompt basic
match /> ?$/
macro paging
send terminal length %s
И мой обновленный сценарий выглядит так:
#!/usr/bin/perl
use warnings;
use strict;
use Net::Appliance::Session;
my $host = '<my_host>';
my $user = '<my_user>';
my $pass = '<my_password>';
my $session = Net::Appliance::Session->new({
add_library => '/home/edunn/switch',
personality => 'custom',
transport => 'SSH',
host => $host,
connect_options => { opts => [ '-q', ], },
});
$session->set_global_log_at('debug');
$session->connect($user,$pass ) or die "Cannot Connect! : $!";
my @output = $session->cmd('show version');
$session->close;
print join("\n",@output);
Но теперь я получаю следующую ошибку
[0.001516] p finding prompt [0.006937] t creating Net::Telnet wrapper for ssh [0.007171] t command expands to: ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -q -l cisco 192.168.2.17 [1.325789] d SEEN: [1.341702] p reading phrasebook /home/edunn/switch/custom/login [1.342318] p storing prompt user [1.343439] p storing prompt pass [1.344178] p storing prompt prompt [1.344881] p storing prompt basic [1.345578] p storing macro paging [1.346353] p nope, doesn't (yet) match basic [1.346577] p nope, doesn't (yet) match pass [1.346789] p nope, doesn't (yet) match user [1.347021] p hit, matches prompt prompt [1.347718] p prompt has been set to (?-xism: ?$) [1.348436] e running macro paging [1.348655] e macro params are: 0 [1.349293] e executing actions [1.349814] e dispatching to execute method [1.350736] t callback received for send [1.350957] t queueing data for send: "terminal length 0" [1.351277] t callback received for match [1.351576] d SEEN: [1.351772] t output matched (?-xism: ?$), storing and returning [1.352222] p setting new prompt to (?-xism: ?$) [1.352437] p prompt has been set to (?-xism: ?$) [1.353120] e running macro paging [1.353323] e macro params are: 24 [1.353860] e executing actions [1.354344] e dispatching to execute method [1.355083] t callback received for send [1.355290] t queueing data for send: "terminal length 24" [1.355535] t callback received for match [1.438431] d SEEN: t [1.438731] t output matched (?-xism: ?$), storing and returning [1.439212] p setting new prompt to (?-xism: ?$) [1.439426] p prompt has been set to (?-xism: ?$)
Глядя на ошибку, похоже, что она совпадает с именем пользователя: и паролем: но затем не удается найти что-то, называемое подсказкой, из которой я понятия не имею, откуда она ее берет.
Спасибо, что посмотрели.
Из Разговорник я вижу
Последнее важное приглашение - это, конечно, простое совпадение с приглашением командной строки, и его следует назвать универсальным.
# example only! prompt generic match /> ?$/
Добавление этого должно решить вашу текущую проблему.
Я искал, как они обрабатывают наследование, чтобы вы могли получить все существующие вещи, такие как базовое приглашение, бесплатно. Я предполагаю, что он основан на структуре каталогов. Если вы разместите вас custom
каталог с его pb
в каталоге ниже cisco
с этими pb
или его копию, которая может работать.
Похоже, из Разговорник который personality => 'cisco'
является своего рода общим. Возможно, тебе повезет больше с IOS
или один из других вариантов. Я не так хорошо знаком с происхождением Cisco, поэтому вы должны искать то, что вам больше всего подходит.
Но при дальнейшем осмотре это может не сильно помочь. Из источник похоже, он ищет Username
или username
, но нет User Name
. Можете ли вы изменить приглашение, чтобы оно соответствовало одному из тех, которые оно ищет?