Prompt personalizado usando Net :: Appliance :: Session

2

Estou tentando usar o ssh em um switch Cisco usando o módulo Perl Net :: Appliance :: Session mas estou encontrando um problema devido à natureza do prompt esperado. O prompt do comutador é o seguinte

User Name:

quando o prompt de nome de usuário básico é esperado, ele não é retornado corretamente. Observando a documentação de Net :: Appliance :: Session , ele fala sobre prompts personalizados, mas não tenho certeza de como para implementá-lo. Refere-se ao Phrasebook.

Se alguém tiver algum exemplo de como isso pode ser alcançado, seria muito apreciado.

Para evitar postagens cruzadas, fiz uma pergunta semelhante em perlmonks ontem. Aqui está o link para esse tópico link

Obrigado antecipadamente.

Exemplo de código ---

#!/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);

UPDATE

Eu alterei meu código para usar um Phrasebook personalizado conforme descrito Net :: CLI :: Interact :: Phrasebook

Meu arquivo de livro de frases se parece com:

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

E meu script atualizado se parece com:

#!/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);

Mas agora recebo o seguinte erro

   [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: ?$)

Olhando para o erro, parece que ele está combinando User Name: e Password: mas, em seguida, ele falha ao procurar por algo chamado prompt, o qual eu não tenho idéia de onde ele está pegando.

Obrigado por procurar.

    
por Ed Dunn 14.09.2017 / 16:38

1 resposta

1

responder para atualizar

Do documentos do Phrasebook que eu vejo

The last essential prompt is of course a simple command line prompt match, and this should be named generic.

# example only!
prompt generic
    match /> ?$/

Adicionar isso deve resolver seu problema atual.

Eu procurei como eles lidam com herança para que você possa obter todas as coisas existentes como o prompt básico de graça. Meu melhor palpite é que ele é baseado na estrutura de diretórios. Se você colocar o diretório custom com seu pb em um diretório abaixo de cisco com seu pb ou uma cópia dele que possa funcionar.

resposta original

Parece que dos documentos do Phrasebook que personality => 'cisco' é uma espécie de genérico. Você pode ter mais sorte com IOS ou uma das outras variantes. Eu não estou tão familiarizado com a linhagem da Cisco, então você deve procurar o que faz mais sentido para você.

Mas após uma análise mais aprofundada, isso pode não ajudar muito. De a origem parece Ele está procurando Username ou username , mas não User Name . Você pode alterar o prompt para se adequar a um dos que ele está procurando?

    
por 15.09.2017 / 02:48

Tags