使用 Net::Appliance::Session 的自定义提示

使用 Net::Appliance::Session 的自定义提示

我正在尝试使用 Perl 模块通过 ssh 连接到 Cisco 交换机网络::设备::会话但由于预期提示的性质,我遇到了一个问题。 switch 提示如下

用户名:

因此,当需要基本用户名提示时,它无法正确返回。查看文档网络::设备::会话它谈到了自定义提示,但我不确定如何实现它。它指的是短语手册。

如果有人能给出实现这一点的例子,我将不胜感激。

为了避免交叉发布,我昨天在 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 查找提示
   [0.006937] t 为 ssh 创建 Net::Telnet 包装器
   [0.007171] t 命令扩展为:ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -q -l cisco 192.168.2.17
   [1.325789] d 已查看:


   [1.341702] p 阅读短语手册 /home/edunn/switch/custom/login
   [1.342318] p 存储提示用户
   [1.343439] p 存储提示通过
   [1.344178] p 存储提示提示
   [1.344881] p 存储提示基本
   [1.345578] p 存储宏分页
   [1.346353] p 不,目前还不符合基本要求
   [1.346577] p 不,尚未匹配通过
   [1.346789] p 不,尚未匹配用户
   [1.347021] p 命中,匹配 prompt prompt
   [1.347718] p 提示已设置为 (?-xism: ?$)
   [1.348436] e 运行宏分页
   [1.348655] e 宏参数为:0
   [1.349293] e 执行操作
   [1.349814] e 调度执行方法
   [1.350736] t 回调已收到,用于发送
   [1.350957] t 排队发送数据:“终端长度 0”
   [1.351277] t 匹配回调已收到
   [1.351576] d 已查看:

   [1.351772] t 输出匹配(?-xism:?$),存储并返回
   [1.352222] p 将新提示设置为 (?-xism: ?$)
   [1.352437] p 提示已设置为 (?-xism: ?$)
   [1.353120] e 运行宏分页
   [1.353323] e 宏参数为:24
   [1.353860] e 执行操作
   [1.354344] e 调度执行方法
   [1.355083] t 回调已收到,用于发送
   [1.355290] t 排队发送数据:“终端长度 24”
   [1.355535] t 匹配回调已收到
   [1.438431] d 已查看:
   [1.438731] t 输出匹配(?-xism:?$),存储并返回
   [1.439212] p 将新提示设置为 (?-xism: ?$)
   [1.439426] p 提示已设置为 (?-xism: ?$)

查看错误,它看起来像是匹配用户名:和密码:但是它在寻找称为提示的东西时失败,我不知道它是从哪里获取它的。

谢谢你的观看。

答案1

回答更新

来自短语手册文档我懂了

最后一个必不可少的提示当然是一个简单的命令行提示匹配,这应该命名为通用。

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

添加该内容应该可以解决您当前的问题。

我研究了它们如何处理继承,以便您可以免费获得所有现有的东西,例如基本提示。我最好的猜测是它基于目录结构。如果您将custom包含它的目录放在包含它的pb目录或它的副本的下面,这可能会起作用。ciscopb

原始答案

看起来从短语手册文档personality => 'cisco'有点通用。您可能更适合使用IOS或其他变体。我对 Cisco 的血统不太熟悉,因此您应该寻找对您来说最有意义的东西。

但进一步检查后,这可能没有多大帮助。来源它看起来像是在寻找Usernameusername,但不是User Name。您能否更改提示符以符合它所寻找的提示符之一?

相关内容