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.