Назад | Перейти на главную страницу

Настраиваемая подсказка с использованием Net :: Appliance :: Session

Я пытаюсь подключиться к коммутатору 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. Можете ли вы изменить приглашение, чтобы оно соответствовало одному из тех, которые оно ищет?