You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python新手求助:Netmiko执行思科Extended Ping失败,求解决方案

解决思科设备自动Extended Ping的问题

嘿,作为刚接触Python和网络自动化的新手,尝试实现思科设备的扩展Ping自动操作遇到问题太正常了!我来帮你拆解一下问题,再给你几个可行的解决方案~

为啥send_command不好使?

思科的Extended Ping是交互式命令——得一步步输入参数(目标IP、ping次数、数据包大小啥的),而net_connect.send_command()是用来执行「输完直接出结果」的非交互式命令(比如show ip route这种),直接用它要么卡住,要么拿不到正确结果。

用Netmiko实现的正确姿势

Netmiko专门提供了send_interactive()(精准匹配交互步骤)和send_command_timing()(靠等待时间处理)来应对交互式场景,优先推荐send_interactive(),可控性更强。

代码示例

from netmiko import ConnectHandler

# 替换成你的设备信息
cisco_device = {
    'device_type': 'cisco_ios',
    'ip': '你的设备IP地址',
    'username': '登录用户名',
    'password': '登录密码',
    'secret': 'enable密码(如果需要进入特权模式)',
}

# 建立SSH连接
net_connect = ConnectHandler(**cisco_device)
# 自动进入特权模式(如果当前不在的话)
if not net_connect.check_enable_mode():
    net_connect.enable()

# 定义扩展Ping的交互步骤:每个元组是「输入内容 → 匹配的设备提示符 → 等待时间」
# 空字符串''代表直接回车用默认值
interactive_steps = [
    ('ping', 'Protocol [ip]:'),
    ('', 'Target IP address:'),
    ('192.168.1.1', 'Repeat count [5]:'),  # 替换成你要ping的目标IP
    ('100', 'Datagram size [100]:'),      # 自定义ping次数
    ('1500', 'Timeout in seconds [2]:'),  # 自定义数据包大小
    ('', 'Extended commands [n]:'),
    ('', 'Sweep range of sizes [n]:'),
    ('', ''),  # 最后一步回车开始执行ping
]

# 执行交互式命令,delay_factor根据设备响应速度调整,避免匹配失败
output = net_connect.send_interactive(interactive_steps, delay_factor=2)

# 打印Ping结果
print(output)

# 关闭连接
net_connect.disconnect()

关键提醒

  • 要确保每个步骤里的「提示符」和你设备实际显示的完全一致,比如有些设备提示符可能是Protocol [ip] >,得对应修改
  • delay_factor可以根据设备快慢调整,设备响应慢就调大一点(比如改成3)

其他实现方法

1. 用Paramiko(底层SSH库)

如果想更灵活控制SSH会话,可以直接用Paramiko手动处理交互:

import paramiko
import time

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('你的设备IP', username='用户名', password='密码')

# 打开shell会话
shell = ssh.invoke_shell()
# 进入特权模式(如果需要)
shell.send('enable\n')
shell.send('你的enable密码\n')
time.sleep(1)

# 一步步输入扩展Ping的参数
shell.send('ping\n')
time.sleep(0.5)
shell.send('\n')  # 协议默认选IP
shell.send('192.168.1.1\n')  # 目标IP
shell.send('100\n')  # ping次数
shell.send('1500\n')  # 数据包大小
shell.send('\n')  # 超时用默认值
shell.send('\n')  # 不启用扩展命令
shell.send('\n')  # 不扫包大小

# 等待命令执行完成,读取输出
time.sleep(5)
output = shell.recv(65535).decode('utf-8')
print(output)

ssh.close()

2. 用NAPALM(网络自动化抽象层)

如果设备支持,NAPALM提供了更简洁的API,扩展Ping可以用cli()方法模拟交互:

from napalm import get_network_driver

# 初始化IOS驱动
driver = get_network_driver('ios')
device = driver('你的设备IP', '用户名', '密码')
device.open()

# 按顺序输入扩展Ping的命令/参数
output = device.cli([
    'ping',
    '',
    '192.168.1.1',
    '100',
    '1500',
    '',
    '',
    ''
])

print(output)
device.close()

3. 思科REST API(设备支持的话)

如果你的思科设备开了RESTCONF/NETCONF,可以直接用API发Ping请求,比如RESTCONF:

import requests
from requests.auth import HTTPBasicAuth

# 设备RESTCONF地址
url = "https://你的设备IP/restconf/data/Cisco-IOS-XE-native:native/ping"
headers = {
    "Accept": "application/yang-data+json",
    "Content-Type": "application/yang-data+json"
}

# 定义Ping参数
payload = {
    "Cisco-IOS-XE-ping:ping": {
        "ipv4": {
            "destination": "192.168.1.1",
            "repeat": 100,
            "datagram-size": 1500
        }
    }
}

# 发送请求,verify=False是跳过证书验证(生产环境建议配置证书)
response = requests.post(url, auth=HTTPBasicAuth('用户名', '密码'), headers=headers, json=payload, verify=False)
print(response.json())

注意:用RESTCONF需要设备提前开启ip http secure-serverrestconf enable等配置,还要确保用户有足够权限。

调试小技巧

  • 先手动在设备上跑一遍Extended Ping,把每个步骤的提示符记下来,确保代码里的匹配字符串完全一致
  • 打开Netmiko的调试日志,看详细交互过程:
    import logging
    logging.basicConfig(filename='netmiko_debug.log', level=logging.DEBUG)
    

内容的提问来源于stack exchange,提问作者ClauNav

火山引擎 最新活动