一. 背景介绍
- 最近换工作了有一百多台数通设备需要管理,正好本人会一点python就尝试参照网上教程和CATGPT来写一个批量链接设备的脚本
二. parmiko简介
-
Paramiko实现了SSHv2协议(底层使用cryptography)。我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。
-
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()
四. 常见错误
- 返回的信息中只有你要执行的命令
执行命令的方式错误如华为设备用exec_command(command)命令执行,执行命令的方式有两种,exec_command(command)和invoke_shell(),可以尝试换一种方式