前言
在网络设备中,一旦设备刚联机就会马上执行分页取消操作,华为设备命令如下。
screen-length 0 temporary
但是,在现网环境中总有场景需要配合回显分页功能来实现回显完整抓取,比如某一账号开通时没有授权分屏指令、某一台防火墙设备配置几万行代码等,这种实际情况通常会影响到CLI命令回显抓取的完整性,设置有时候回显等待太久而造成读取超时等,从而联机失败
实验背景
现有一台安装了Python的Windows运维终端,其IP地址和防火墙位于同一网段,现在假设这台交换机的配置很长,把他理解成一台行为管控的防火墙,那么,如何通过Python脚本与真机设备分页符进行互动,而非联机后直接取消分页,如何通过这种方式把现网设备中的超长回显逐步提取出来
华为用来控制回显长度的命令
screen-length 10 temporary
这样,现网的实际场景就变成了手工控制的实验场景,每次回显只显示10行
实验目的
(1)Python脚本Paramiko登录一台交换机,设置回显分页,参数为10
(2)回显信息如出现分页符More字符字样,则Paramiko继续发送空格指令,知道分页结束
(3)处理回显信息,将分页符处理掉
实验思路
首先,先完成Python脚本怎么在带分页的回显上发送空格指令,并把每个分页都抓取出来,且抓取完整,然后再考虑怎么把More字样做规范化处理
实验准备
代码如下
import paramiko import time ip = "192.168.200.2" username = "python" password = "python" client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname=ip, username=username, password=password,look_for_keys=False) print("成功登录到{}".format(ip)) command = client.invoke_shell() command.send('screen-length 10 temporary\n') command.send('disp cur \n') time.sleep(0.5) output = "" #定义一个字符串变量来装分页回显,对回显进行拼接 #出现分页符More则发送空格指令,直到分页结束 while True: page = command.recv(65535).decode("ascii") output += page time.sleep(0.1) if page.endswith('>') or page.endswith(']'): #判断字符串是否以">"或者"]"结尾 break if " ---- More ----" in page: command.send(" ") output = re.sub(r" ---- More ----.*42D","",output) #用re调用正则表达式匹配出来乱码的字符,达到修饰最后会显得效果,如果不修饰会出现乱码,下面会给大家演示 print(output) client.close()
运行结果
这是不加修饰的回显
这是加了修饰的回显
至此,实验结束