Networking

將 SSH 會話的命令輸出轉儲到 procurve

  • November 7, 2019

我正在嘗試從 2 個不同位置的 12 個 procurve 交換機的集合中獲取命令“show mac-address”的資訊,這些交換機都通過光纖 PTP 連接。我想將其導入 SQL 以獲取一些統計、移動、路線等的預定報告……我已經設法生成了一些非常有趣和有用的數據,這些數據最終將允許我將我繼承的這個怪物變成更少的怪物是。

我有這個工作的所有組件,除了我必須使用 putty 手動獲取每個開關的數據,將它們保存在計劃任務將轉儲格式化為 csv 的目錄中,清理它們,並使用 BULK INSERT 導入它們。

現在我想自動從交換機檢索數據,這樣我就可以專注於數據方面,而不再在收集方面花費太多時間。

我嘗試過 PLINK,但似乎存在某種仿真問題,其中數據被解釋為不正確的格式,並且我得到的文件充滿了亂碼。

使用…

plink -batch -ssh -l <username> -pw <password> xxx.xxx.xxx.xxx < cmds.txt > out.txt

開關在堆棧中,所以我必須通過“不是 hp 管理”消息和“你想登錄哪個開關”提示,這似乎只適用於文件中的 \n\n(和我一樣當我登錄膩子時,會輸入兩次)但過去我得到了長長的 ASCII 序列,這看起來很奇怪,因為到目前為止的一切都可以正常工作。

我已經接受了 putty 中的密鑰,並且再次因為我收到了所有登錄和堆棧指揮官消息,我假設所有這些都有效。

關於如何使其工作或實現相同目標的合理替代方案的任何線索?

我得到的例子……

HP J9148A 2910al-48G-PoE Switch

Software revision W.15.13.0005



Copyright (C) 1991-2014 Hewlett-Packard Development Company, L.P.

                  RESTRICTED RIGHTS LEGEND
Confidential computer software.  Valid license from HP required for possession,
use or copying. Consistent with FAR 12.211 and 12.212, Commercial Computer
Software, Computer Software Documentation, and Technical Data for Commercial
Items are licensed to the U.S. Government under vendor's standard commercial
license.
                  HEWLETT-PACKARD DEVELOPMENT COMPANY, L.P. 
                  20555 State Highway 249, Houston, TX 77070


Non-HP transceiver detected, which may cause network problems.
Use 'show interface transceiver' command for details.
HP will not support or troubleshoot problems with these transceivers.
[1;15r[1;1H[24;1HPress any key to continue[15;1H[?25h[24;27H[2J[?7l[1;15r[?6l[24;27H[?25h[23;1H  Stack Members

 SN MAC Address   System Name   Device Type          Status                   
 -- ------------- ------------- -------------------- -------------------------
 0  xxxxxx-xxxxxx Switch1        HP 2910al-48G-PoE   Commander Up             
 1  xxxxxx-xxxxxx Switch2        HP 2910al-48G       Member Up                
 2  xxxxxx-xxxxxx Switch3        HP 2910al-24G-PoE   Member Up                                

[23;1HEnter switch number to connect to or <CR>:[23;1H[23;44H[?25h[23;1H[?25h[23;44H[?6l[1;24r[?7l[2J[1;1H[1920;1920H[6n[1;1HYour previous successful login (as manager) was on 2016-01-29 19:31:41     
from xx.x.x.xxx
[1;24r[24;1H[24;1H[2K[24;1H[?25h[24;1H[24;1HSwitch1# [24;1H[24;11H[24;1H[?25h[24;11H[24;0HE[24;1H[24;11H[24;1H[2K[24;1H[?25h[24;1H[1;24r[24;1H[1;24r[24;1H[24;1H[2K[24;1H[?25h[24;1H[24;1HSwitch1# [24;1H[24;11H[24;1H[?25h[24;11H[24;0HE[24;1H[24;11H[24;1H[2K[24;1H[?25h[24;1H[1;24r[24;1H[1;24r[24;1H[24;1H[2K[24;1H[?25h[24;1H[24;1HSwitch1#

所以我在開關控制台上得到了 Switch1# 提示。

我的輸入文件目前只是

show mac-address

上面有兩個空行來執行兩個“任意鍵”並繼續“請求。

非常感謝任何幫助。

我從來沒有讓這個按預期工作,而且我已經很長時間沒有回到這個網站了,但是由於這個問題似乎很受歡迎,我決定發布我最終做了什麼。

我在設備上啟用了 telnet,並使用以下和 NCAT 對其進行偽腳本 telnet 樣式命令。

這使我可以向 TFTP 發出複制命令,並讓交換機將數據發送回給我,而不是嘗試從返回的輸出中解析它。當然,我不想對密碼等進行硬編碼,並使其可重用於未來的需要。它讓我解決了我遇到的問題。:-)

switch.txt 只是一個 IP 地址列表,我不得不使用 NCAT 7.40 作為過去的版本,它有一個阻止它正常工作的錯誤。

@ECHO OFF
IF !%1!==!! GOTO no
IF !%2!==!! GOTO no
FOR /F "delims=" %%s IN (switches.txt) DO (
   ECHO admin> CMDS
   ECHO %2>> CMDS
   ECHO(>>CMDS
   ECHO(>> CMDS
   ECHO copy command 'show mac-address' tftp %1 %%s.txt>> CMDS
   ECHO exit>> CMDS
NCAT -t --send-only %%s 23 < CMDS
)
DEL CMDS 1>nul 2>nul
GOTO ext
:no
ECHO ^</NO!^>
:ext

當然,這不像 SSH 方法那樣安全,事實上,除非您知道流量沒有被攔截,否則我不建議這樣做,因為它很容易被嗅探(包括憑據),但它非常實用。使用專用 VLAN 和專門用於自動化的單獨子網可以在*一定程度上減輕這種情況。*認為它可能有助於其他嘗試自動化此類繁瑣任務的人。如果沒有其他我說明哪裡有意志和系統管理員,那麼即使它是一個骯髒的解決方案,也有一個解決方案。希望它可以幫助別人。

您必須使用 Windows 中的膩子嗎?來自Linux機器,我要麼做

( echo $password ; echo ; echo ; echo show mac-address ) \
| ssh -l $user xxx.xxx.xxx.xxx

或者如果這不起作用,我會使用該程序expect。事實上,有一個 Windows 版本的 expect 可以用來代替 plink。

期望語法範例在我的腦海中出現變化的開關輸出(應該使用或不使用“按任意鍵”,但當然我沒有測試過):

#!/usr/bin/expect -f
spawn ssh -l loginuser [lindex $argv 0]

set timeout 600

while (1) {
   expect "Press any key to continue" { send "\n" }
          "Enter switch number to connect to or <CR>:" { send "password\n" }
          "#" { break }
}

send "show mac-address\n"

expect "#"

send "quit\n"

expect eof

但是按照 Paul 的建議並嘗試一下autoexpect,它會讓您執行腳本並輸出執行相同操作的期望腳本。然後您獲取該輸出並將交換機的名稱或 IP 替換為[lindex $argv 0],並使用交換機的名稱作為參數執行它。

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