使用 Net::Appliance::Session 自定義提示
我正在嘗試使用 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
放在下面的目錄中,則cisco
其pb
或其副本可能會起作用。原始答案
從Phrasebook 文件中看起來
personality => 'cisco'
有點通用。IOS
使用其他變體或其中一種變體可能會更好。我對思科的血統不是很熟悉,所以你應該尋找對你最有意義的東西。但經過進一步檢查,這可能沒有多大幫助。從原始碼看來,它正在尋找
Username
orusername
,但不是User Name
。您可以更改提示以符合它正在尋找的提示之一嗎?