我正在尝试使用 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
目录或它的副本的下面,这可能会起作用。cisco
pb
原始答案
看起来从短语手册文档这personality => 'cisco'
有点通用。您可能更适合使用IOS
或其他变体。我对 Cisco 的血统不太熟悉,因此您应该寻找对您来说最有意义的东西。
但进一步检查后,这可能没有多大帮助。来源它看起来像是在寻找Username
或username
,但不是User Name
。您能否更改提示符以符合它所寻找的提示符之一?