3. Paramiko实现网络设备自动化巡检


import paramiko  # paramiko模块需要安装后使用
import time

def send_dis_cmd(ip, username, password, commands):
    try:
        # 创建SSH对象.使用Paramiko SSHClient()实例化SSH对象
        ssh = paramiko.SSHClient()

        # 允许连接未知主机.即新建立ssh连接时不需要再输入yes或no进行确认。# 自动添加主机名及主机密钥到本地HostKeys对象。
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 建立SSH会话连接
        ssh.connect(hostname=ip, username=username,
                    password=password, look_for_keys=False)
        print(f"SSH 已经登陆 {ip}")
        cli = ssh.invoke_shell()
        cli.send('screen-length 0 temporary\n')
        for cmd in commands_S:
            cli.send(cmd + "\n")
            # Python默认无间隔按顺序执行所有代码,在使用paramiko向交换机发# 送配置命令时候可能会遇到SSH响应不及时或者设备回显信息显示不
            # 全。此时,可以使用time模块下的sleep方法来人为暂停程序。
            time.sleep(1)
        # 抓取channel回显信息。invoke_shell()已经创建了一个channel逻辑通
        # 道。此前所有的输入输出的过程信息都在此channel中,获取此channel中
        # 所有信息,输出显示。调用cli.recv(),然后使用decode()进行对其解码,
        # 最后赋值给dis_cu。cli.recv(999999)作用是接收channel中的数据,数
        # 据最大量为999999 bytes。decode( )方法作用是以指定的编码格式解码
        # bytes对象,默认编码格式为utf-8
        dis_cu = cli.recv(999999).decode()
        # 打印回显内容
        print(dis_cu)
        ssh.close()
    except paramiko.ssh_exception.AuthenticationException:
        print(f"\n\tUser authentication failed for {ip}.\n")

if __name__ == "__main__":
    # 路由器上执行的运维命令
    commands_R = ["display version", "display patch-information",
                  "display clock", "display device",
                  "display health", "display memory-usage",
                  "display logbuffer"]
    # 交换机上执行的运维命令
    commands_S = ["display version", "display patch-information",
                  "display clock", "display device",
                  "display cpu-usage configuration",
                  "display memory-usage",
                  "display logbuffer summary"]
    # 网络设备地址信息,通过字典的键的第一字母表示是路由器还是交换机
    devices = {"R_SZ1": "10.2.12.1",
               "R_SZ2": "10.2.12.2",
               "S_S4": "10.3.1.254",
               "S_S1": "10.1.4.252",
               "S_S2": "10.1.4.253"
               }
    username = "python"
    password = "Huawei12#$"
    for key in devices.keys():
        ip = devices[key]
        if key.startswith("R"):  # 路由器执行commands_R
            send_dis_cmd(ip, username, password, commands_R)
        else:  # 交换机执行commands_S
            send_dis_cmd(ip, username, password, commands_S)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容