第4章:Netmiko入门——Netmiko库的安装、连接华为/思科设备、执行简单命令
好,咱们进入Netmiko的世界。
说实话,刚开始做网络运维那会儿,我每天的工作就是SSH到几十台设备上,敲同样的命令,看同样的输出。那时候我就想,要是能有个工具替我干这些重复劳动该多好。后来遇到了Netmiko,嗯,就是它了。
4.1 Netmiko是什么?
Netmiko是一个Python库,专门用来简化网络设备SSH连接和命令执行。它基于Paramiko做了上层封装,说白了就是帮你省去了处理SSH会话、等待提示符、处理分页输出这些脏活累活。
我个人习惯把它叫做「网络运维的瑞士军刀」。为什么?因为它支持几十种厂商的设备——华为、思科、H3C、锐捷、Juniper……基本上你叫得上名字的,它都支持。
核心能力:
- 自动处理SSH连接和认证
- 自动等待命令提示符返回
- 自动处理分页输出(比如思科的 --More--)
- 支持多种设备类型驱动
- 支持配置模式、特权模式切换
4.2 安装Netmiko
安装很简单,一行命令搞定。不过我要提醒你——务必在虚拟环境中安装。我早期吃过这个亏,直接在系统Python里装了一堆库,结果版本冲突,搞得整个环境都乱了。
# 推荐:先创建虚拟环境
python -m venv netmiko_env
# Windows下激活
netmiko_env\Scripts\activate
# Linux/Mac下激活
source netmiko_env/bin/activate
# 安装Netmiko
pip install netmiko
安装完成后,验证一下:
python -c "import netmiko; print(netmiko.__version__)"
如果能正常输出版本号,说明安装成功了。我目前用的是4.3.0版本,建议你也用最新版,因为老版本对华为设备的支持有些小bug。
小提示:如果你在公司内网,可能需要配置代理:
pip install netmiko --proxy http://your-proxy:port
4.3 连接华为设备
华为设备在Netmiko中对应的设备类型是 huawei。我当年第一次用Netmiko连华为设备时,踩了个坑——忘记指定端口号,结果默认连22端口,而华为设备有时候SSH端口会改成其他端口。
来看一个完整的连接示例:
from netmiko import ConnectHandler
# 定义华为设备参数
huawei_device = {
'device_type': 'huawei',
'host': '192.168.1.100',
'username': 'admin',
'password': 'Huawei@123',
'port': 22, # 默认是22,如果改了记得指定
'timeout': 30, # 超时时间,我习惯设30秒
}
# 建立连接
try:
connection = ConnectHandler(**huawei_device)
print("成功连接到华为设备")
# 执行命令
output = connection.send_command('display version')
print(output)
# 关闭连接
connection.disconnect()
except Exception as e:
print(f"连接失败:{e}")
这里要注意,send_command 默认会等待命令执行完毕并返回完整输出。如果你执行的是耗时较长的命令,可以加个 delay_factor 参数:
output = connection.send_command('display interface brief', delay_factor=2)
避坑指南:我曾经遇到过华为设备返回中文乱码的问题。原因是设备终端编码设置不对。解决方案是在连接参数中加上:
huawei_device['global_delay_factor'] = 1
huawei_device['session_log'] = 'session.log' # 记录会话日志,方便排查
4.4 连接思科设备
思科设备是Netmiko的「亲儿子」,支持最完善。设备类型用 cisco_ios 或 cisco_iosxe。
from netmiko import ConnectHandler
# 定义思科设备参数
cisco_device = {
'device_type': 'cisco_ios',
'host': '10.0.0.1',
'username': 'cisco',
'password': 'Cisco@123',
'secret': 'enable_password', # 进入特权模式的密码
}
# 建立连接
connection = ConnectHandler(**cisco_device)
print("成功连接到思科设备")
# 进入特权模式
connection.enable()
# 执行命令
output = connection.send_command('show ip interface brief')
print(output)
# 执行配置命令(需要进入配置模式)
config_commands = [
'interface GigabitEthernet0/1',
'description Connected_to_Core',
'no shutdown',
]
output = connection.send_config_set(config_commands)
print(output)
# 保存配置
connection.save_config()
connection.disconnect()
你发现没有?思科比华为多了一个 enable() 步骤。这是因为思科设备有用户模式和特权模式之分。华为设备默认就是特权模式,所以不需要这一步。
经验之谈:我在项目中同时管理华为和思科设备时,会写一个统一的连接函数,根据设备类型自动判断是否需要执行enable():
def connect_device(device_info):
conn = ConnectHandler(**device_info)
if device_info['device_type'].startswith('cisco'):
conn.enable()
return conn
4.5 执行简单命令的几种方式
Netmiko提供了几种执行命令的方法,我整理了一个表格:
| 方法 | 说明 | 适用场景 |
|---|---|---|
send_command() |
执行单条命令,等待输出 | 查看状态、获取信息 |
send_command_timing() |
按时间间隔发送命令,不等待提示符 | 执行耗时不确定的命令 |
send_config_set() |
发送一组配置命令 | 批量配置设备 |
send_config_from_file() |
从文件读取配置并发送 | 大规模配置下发 |
举个例子,如果你要批量查看接口状态:
# 方式一:普通命令
output = connection.send_command('display interface brief')
# 方式二:带分页处理的命令(华为设备)
output = connection.send_command('display current-configuration',
expect_string=r'<.*>')
# 方式三:执行多条命令
commands = ['display version', 'display device', 'display interface brief']
for cmd in commands:
print(f"执行命令:{cmd}")
output = connection.send_command(cmd)
print(output[:200]) # 只打印前200个字符,避免刷屏
实用技巧:用 send_command_timing() 处理那些输出特别长的命令。比如查看完整配置时,Netmiko默认等待提示符,但有时候输出太长会超时。用 timing 模式可以避免这个问题:
output = connection.send_command_timing('display current-configuration',
delay_factor=3,
max_loops=50)
4.6 常见问题与排错
我整理了几个新手最容易遇到的问题:
- 连接超时:检查IP地址、端口、防火墙是否放行。我曾经被防火墙坑过一整天。
- 认证失败:确认用户名密码正确。注意华为设备有时区分大小写。
- 设备类型错误:华为用
huawei,思科用cisco_ios,别搞混了。 - 命令输出不完整:加
delay_factor或改用send_command_timing()。 - 编码问题:华为设备返回中文时,设置
encoding='utf-8'。
重要提醒:生产环境操作前,一定要先在测试设备上验证脚本。我见过有人直接在核心设备上跑脚本,结果配置错了导致全网中断。嗯,那个人就是我……从那以后,我养成了先在测试环境跑一遍的习惯。
4.7 本章小结
Netmiko入门其实不难,核心就三步:安装、连接、执行命令。你只要记住:
- 华为用
huawei,思科用cisco_ios - 思科需要
enable()进入特权模式 - 命令执行用
send_command(),配置下发用send_config_set() - 遇到问题先检查连接参数,再检查设备类型
下一章我们会深入Netmiko的高级用法,包括批量处理多台设备、异常处理、日志记录等。准备好了吗?咱们继续。