我正在尝试使用命令“show mac-address”获取位于 2 个不同位置的 12 个 procurve 交换机的信息,这些交换机均通过光纤 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 起作用(与我登录到 putty 时输入两次相同)但过去我得到了很长的 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
使用上面的两个空行来执行两个“任意键”和“继续”请求。
非常感谢您的帮助。
答案1
你必须使用 Windows 的 Putty 吗?对于 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]
,并以交换机的名称作为参数执行它。
答案2
我从来没有让它按预期工作,而且我很久没有回到这个网站了,但由于这个问题似乎很受欢迎,我决定发布我最终所做的事情。
我在设备上启用了 telnet,并使用以下内容和 NCAT 向其执行 psudo 脚本 telnet 样式命令。
这样我就可以向 TFTP 发出复制命令,让交换机将数据发回给我,而不是尝试从返回的输出中解析数据。当然,我不想硬编码密码等,并使其可重复使用以满足将来的需求。它帮助我解决了我遇到的问题。:-)
switches.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 和专门用于自动化的单独子网,可以减少此类问题。我认为这可能有助于其他尝试自动化此类繁琐任务的人。如果我没有说明哪里有意愿和系统管理员,那么即使解决方案很肮脏,也存在解决方案。希望这对其他人有所帮助。