一、前言
作为一个网工,有时候管理多台网络设可能会遇到力不从心的情况。今天开始我们将利用python语言来实现自动化运维操作。(初步开始学习)
二、环境准备
目前所用到的环境是 windows + python3.11 + paramiko模块 + IDE工具(pycharm)
paramiko模块是用于模拟 SSH 方式连接网络设备的
三、 paramiko模块的安装
1、pip 的方式安装
在CMD 中输入 pip install paramiko
2、paramiko 模块帮助手册
进入python 环境,然后导入 paramiko 模块, 输入 help(paramiko)
四、连接网络设备
1、连接网络设备的几个重要参数
a、主机名(IP 地址)
b、端口号(默认 22 )
c、用户名
d、密码
2、首先我们导入 paramiko 模块
import paramiko
import paramiko
paramiko 类的代码如下所示
import paramiko
import time
class LoginSSH(object):
# 基本信息初始化
def __init__(self, hostname, port, username, password):
"""
初始化需要的参数信息
"""
self.hostname = hostname
self.port = port
self.username = username
self.password = password
self.ssh_client = paramiko.SSHClient()
# 通过这个set_missing_host_key_policy方法用于实现远程登录是否需要确认输入yes,否则保存(相当于白名单的作用)
self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 使用connect类来连接远程服务器
self.ssh_client.connect(hostname=self.hostname,
port=self.port,
username=self.username,
password=self.password)
self.sw_conn = self.ssh_client.invoke_shell()
# 该方法是执行交换机命令,并得到命令返回结果
def recv_result(self, str_cmd):
self.sw_conn.send(str_cmd) # 执行命令
# 用于接收返回的信息
result = ''
while True:
page = self.sw_conn.recv(65535).decode()
result += page
time.sleep(0.3)
if page.endswith('>') or page.endswith(']'):
break
if " ---- More ----" in page:
self.sw_conn.send(" ")
# 优化回显内容,不会出现 ---- More ---- 等标识符
result = result.replace(" ---- More ----\x1b[42D \x1b[42D", '')
return result
说明: recv_result() 方法,传入的参数是需要执行的交换机命令, 例如你需要查看所有配置信息,你可以输入“ dis cu \n" , 此处的 ”\n“ 模拟的是在输入完命令后回车的操作,要不然会一直卡在输入命令的界面,无法进行下一步操作。
返回的结果是,执行该命令后所有的回显信息。
调用方式如下
# 定义一个空列表,该列表是待监控的网络设备集合
sw_list = ['172.16.34.1']
username = '用户名'
passwd = '密码'
# 实例化一个连接对象(该对象已登陆交换机设备)
sw = LoginSSH(sw_list[0], 22, username, passwd)
res1 = sw.recv_result("dis lldp ne br | in FP\n")
print(res1)
sw_list 是一个待连接网络设备的列表,当然可以写成文件的方式,可以自定义。
username 和 passwd 分别是用户名及密码信息
然后 sw = LoginSSH(sw_list[0], 22, username, passwd) 是对该类进行一个实例化操作。
最后执行 recv_result() 方法获取回显数据
此时你已登陆到网络设备中,也能执行交换机的所有命令了!
完整代码如下:
import paramiko
import time
class LoginSSH(object):
# 基本信息初始化
def __init__(self, hostname, port, username, password):
"""
初始化需要的参数信息
"""
self.hostname = hostname
self.port = port
self.username = username
self.password = password
self.ssh_client = paramiko.SSHClient()
# 通过这个set_missing_host_key_policy方法用于实现远程登录是否需要确认输入yes,否则保存(相当于白名单的作用)
self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 使用connect类来连接远程服务器
self.ssh_client.connect(hostname=self.hostname,
port=self.port,
username=self.username,
password=self.password)
self.sw_conn = self.ssh_client.invoke_shell()
# 该方法是执行交换机命令,并得到命令返回结果
def recv_result(self, str_cmd):
self.sw_conn.send(str_cmd) # 执行命令
# 用于接收返回的信息
result = ''
while True:
page = self.sw_conn.recv(65535).decode(encoding="utf-8")
result += page
time.sleep(0.1)
if page.endswith('>') or page.endswith(']'):
break
if " ---- More ----" in page:
# 当遇到 -- more -- 信息时,模拟敲击空格,让其继续显示余下内容
self.sw_conn.send(" ")
# 优化回显内容,不会出现 ---- More ---- 等标识符
result = result.replace(" ---- More ----\x1b[42D \x1b[42D", '')
return result
# 定义一个空列表,该列表是待监控的网络设备集合
sw_list = ['主机IP地址']
username = '用户名'
passwd = '密码'
# 实例化一个连接对象(该对象已登陆交换机设备)
sw = LoginSSH(sw_list[0], 22, username, passwd)
res1 = sw.recv_result("dis lldp ne br | in FP\n")
print(res1)
下一期实现- 【 自动化运维(2)- 利用 Python 自动备份交换机配置 】