paramiko链接网络设备并导出配置

发布时间 2023-09-19 10:31:53作者: ProgrammerXiaoQin
一. 背景介绍

  1. 最近换工作了有一百多台数通设备需要管理,正好本人会一点python就尝试参照网上教程和CATGPT来写一个批量链接设备的脚本
二. parmiko简介
  1. Paramiko实现了SSHv2协议(底层使用cryptography)。我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。

  2. Paramiko有两个核心组件: SSHClient , SFTPClient , 前者是对ssh会话的封装 , 后者是对sftp的封装 . 这里我们主要用SSHClient

三. 链接华为(HUAWEI)设备执行命令 , 并返回结果
# 华为设备SSH链接
import paramiko
import time
def sshClient_HUAWEI(hostname,port,username,password):
    try:
        #创建SSH客户端Client对象
        ssh = paramiko.SSHClient()
        #允许连接不在know_hosts文件中的主机 , 相当于shh链接陌生主机的时候自动输入yes
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) 
        #建立session , timeout为链接超时时间 , look_for_keys=False关闭在~/.ssh中搜索私钥文件
        
ssh.connect(hostname=hostname,port=port,username=username,password=password,timeout=30,look_for_keys=False)
        
        #创建交互式shell , 华为设备必须创建交互式shell执行命令 , 直接用Client对象执行命令会报错
        shell = ssh.invoke_shell()
        
        #执行命令 , 查询设备信息
        shell.send('screen-length 0 temporary\n') # 关闭分屏显示
        shell.send('display saved-configuration\n') # 查看保存的配置
        #等待命令执行完成,不然获取的配置信息可能不全
        time.sleep(2)
        return shell.recv(65535).decode() #返回配置信息
    except paramiko.AuthenticationException:
        print(f"HUAWEI:{hostname} , 认证失败,请检查用户名和密码。")
    except paramiko.SSHException as e:
        print(f"HUAWEI:{hostname} ,  SSH连接失败: {str(e)}")
    except Exception :
        print(f"HUAWEI:{hostname} ,  发生错误: {str(hostname)}")
    finally:
        # 关闭SSH连接
        shell.close()
        ssh.close()
#hostname为你要链接的主机 , port端口,ssh协议默认为22
#username,字符串类型的用户名,password字符串类型的密码
cfg = sshClient_HUAWEI(hostname,port,username,password)
print(cfg)
三. 链接H3C设备执行命令 , 并返回结果
def sshClient_H3C(hostname,port,username,password):
    try:
        #创建SSH客户端Client对象
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) #允许连接不在know_hosts文件中的主机
        #建立session
        ssh.connect(hostname=hostname,port=port,username=username,password=password,timeout=30,look_for_keys=False)
        

        #H3C设备命令 , 查询已保存的配置
        command = 'display saved-configuration \n'
        #直接执行命令 , 结果依次为标注输入,标准输出,标准错误输出
        #如果命令正确,执行顺利结果就在stdout里面,如果命令错误和权限不够结果就在stderr里面
        #如果这行报错可以尝试执行后关闭标准输入std.close()
        #timeout为命令执行超时时间,单位秒
        stdin, stdout, stderr = ssh.exec_command(command,timeout=10)
        #stdin.close()
        time.sleep(2)
        #读取标准输出,将字节转换为字符并返回
        return stdout.read().decode('utf-8')
        
    except paramiko.AuthenticationException:
        print(f"H3C: {hostname} , 认证失败,请检查用户名和密码。")
    except paramiko.SSHException as e:
        print(f"H3C: {hostname} , {str(e)}")
    except Exception :
        print(f"H3C: {hostname} , {str(hostname)}")
    finally:
        # 关闭SSH连接
        ssh.close()
四. 常见错误
  1. 返回的信息中只有你要执行的命令
    执行命令的方式错误如华为设备用exec_command(command)命令执行,执行命令的方式有两种,exec_command(command)和invoke_shell(),可以尝试换一种方式