第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_ioscisco_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 常见问题与排错

我整理了几个新手最容易遇到的问题:

  1. 连接超时:检查IP地址、端口、防火墙是否放行。我曾经被防火墙坑过一整天。
  2. 认证失败:确认用户名密码正确。注意华为设备有时区分大小写。
  3. 设备类型错误:华为用 huawei,思科用 cisco_ios,别搞混了。
  4. 命令输出不完整:加 delay_factor 或改用 send_command_timing()
  5. 编码问题:华为设备返回中文时,设置 encoding='utf-8'

重要提醒:生产环境操作前,一定要先在测试设备上验证脚本。我见过有人直接在核心设备上跑脚本,结果配置错了导致全网中断。嗯,那个人就是我……从那以后,我养成了先在测试环境跑一遍的习惯。

4.7 本章小结

Netmiko入门其实不难,核心就三步:安装、连接、执行命令。你只要记住:

  • 华为用 huawei,思科用 cisco_ios
  • 思科需要 enable() 进入特权模式
  • 命令执行用 send_command(),配置下发用 send_config_set()
  • 遇到问题先检查连接参数,再检查设备类型

下一章我们会深入Netmiko的高级用法,包括批量处理多台设备、异常处理、日志记录等。准备好了吗?咱们继续。