实验拓扑:
将路由器桥接到与Linux系统同一网段,保证可以Linux系统和路由器能够通信。
要求:
一共要制作两个函数:
第一个函数用于获取设备配置(注意:华为设备只获取sysname xxx到return之间的部分)。
第二个函数每五秒获取一次设备配置,并计算配置的MD5值。如果和之前的MD5相同就打印MD5,如果不相同就打印告警并退出。
步骤:
1.在AR上配置SSH。(略)
2.创建dev_ssh.py文件,使用paramiko连接AR。
# 导入paramiko模块 import paramiko import time # 定义ssh的函数,方便调用 def dev_ssh(ip, username, password, port=22, cmd='dis cu '): ssh = paramiko.SSHClient() ssh.load_system_host_keys() # 如果没有密钥,添加密钥 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip, port, username, password, timeout=5, compress=True) command = ssh.invoke_shell() # 保证dis cu能够一次将所有信息显示出来 command.send('screen-length 0 temporary ') # 输入命令 command.send(cmd) time.sleep(2) output = command.recv(65535) x = output.decode('ascii') # 返回shell界面显示的内容 return x # 本地进行测试 if __name__ == '__main__': print(dev_ssh('192.168.0.11', 'prin', 'Huawei@123'))
3.创建compare_md5.py文件,获取配置的MD5值并比较。
# 引入dev_ssh.py模块中的dev_ssh函数 from dev_ssh import dev_ssh # 引入正则表达式的模块 import re # 引入计算hash值的模块 import hashlib # 引入time模块 import time # 定义获取配置的函数 def dev_get_config(ip, username='admin', password='Huawei@123'): try: # 调用dev_ssh函数得到配置信息 dev_config_raw = dev_ssh(ip, username, password) # 使用正则表示匹配sysname --- return之前的配置信息 dev_config = re.findall('sysname[sS]+return', dev_config_raw)[0] # 返回处理后的配置信息 return dev_config except Exception: return # 定义计算和比较MD5值的函数 def check_diff(ip, username='admin', password='Huawei@123'): # 计算初始的MD5值,并赋值给before_md5变量 m = hashlib.md5() m.update(dev_get_config(ip, username).encode()) before_md5 = m.hexdigest() # 每隔5s检查重新计算一次MD5值,并与初始的MD5值进行对比 while True: time.sleep(5) m = hashlib.md5() m.update(dev_get_config(ip, username, password).encode()) # 如果两次对比相同,打印出MD5值 if before_md5 == m.hexdigest(): print(before_md5) # 如果两次对比不相同,在打印最新的MD5值的同时,退出循环,并且打印告警信息 else: print(m.hexdigest()) print('MD5 value changed!') break # 进行测试 if __name__ == '__main__': check_diff('192.168.0.11', 'prin')
查看结果:
在程序运行的时候,我们将配置做一定的改变,可以看到MD5值发生了改变,并且有对应的提示。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !