Cisco

使用 Net::Appliance::Session 自定義提示

  • September 15, 2017

我正在嘗試使用 Perl 模組Net::Appliance::Session SSH 進入 Cisco 交換機,但由於預期提示的性質,我遇到了問題。切換提示如下

使用者名:

因此,當預期基本使用者名提示時,它不會正確返回。查看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::Phrasebook所述

我的片語手冊文件如下所示:

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 命中,匹配提示符
[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: ?$)

查看錯誤,它看起來像是匹配使用者名:和密碼:但隨後它無法查找名為提示的內容,我不知道它是從哪裡獲取的。

感謝您的關注。

回答更新

從我看到的片語手冊文件中

最後一個必要的提示符當然是一個簡單的命令行提示符匹配,這應該被命名為通用的。

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

添加它應該可以解決您目前的問題。

我尋找他們如何處理繼承,這樣你就可以免費獲得所有現有的東西,比如基本提示。我最好的猜測是它基於目錄結構。如果您將custom目錄及其副本pb放在下面的目錄中,則ciscopb或其副本可能會起作用。

原始答案

從Phrasebook 文件中看起來personality => 'cisco'有點通用。IOS使用其他變體或其中一種變體可能會更好。我對思科的血統不是很熟悉,所以你應該尋找對你最有意義的東西。

但經過進一步檢查,這可能沒有多大幫助。從原始碼看來,它正在尋找Usernameor username,但不是User Name。您可以更改提示以符合它正在尋找的提示之一嗎?

引用自:https://serverfault.com/questions/873672