本文目录导读:

我理解您是想寻找能批量处理Power over Ethernet (PoE) 设备的实用脚本,这通常用于网络设备的远程管理、配置或监控,由于PoE本身是一个硬件供电标准,脚本通常是通过网络协议(如SNMP、SSH、CLI)与支持PoE的交换机或设备交互。
这里有几种常见的实用脚本方案,您可以根据具体需求选择:
批量启用/禁用PoE端口(使用SNMP)
这是最常见、最成熟的批量操作方式,几乎所有的管理型PoE交换机都支持SNMP。
原理: 通过SNMP OID(对象标识符)设置端口PoE供电状态。
实用脚本示例(Bash + snmpset):
#!/bin/bash
# 批量禁用1-24号端口的PoE供电
SWITCH_IP="192.168.1.100"
COMMUNITY="public" # 生产环境替换为private
OID_BASE="1.3.6.1.2.1.105.1.1.1.3" # 常见的PethPsePortAdminEnable OID
for port in $(seq 1 24); do
# 索引通常为端口号,有些交换机OID不同
OID="${OID_BASE}.${port}"
# 设置值为2 (disabled),1为enabled
snmpset -v2c -c ${COMMUNITY} ${SWITCH_IP} ${OID} i 2
if [ $? -eq 0 ]; then
echo "端口 ${port} PoE 已禁用"
else
echo "端口 ${port} 操作失败"
fi
done
- 优点: 速度快,不依赖SSH交互
- 缺点: 需要交换机开启SNMP,不同厂商OID可能不同
批量获取PoE功耗信息(使用SNMP)
监控所有PoE端口的实时功耗。
实用脚本示例(Python + pysnmp):
from pysnmp.hlapi import *
import sys
def get_poe_power(ip, community):
# 常见功耗OID: pethPsePortPower (1.3.6.1.2.1.105.1.1.1.5)
oid = "1.3.6.1.2.1.105.1.1.1.5"
for port in range(1, 25):
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
CommunityData(community),
UdpTransportTarget((ip, 161)),
ContextData(),
ObjectType(ObjectIdentity(oid + f".{port}")))
)
if errorIndication:
print(f"端口{port}: 查询失败 ({errorIndication})")
else:
for varBind in varBinds:
print(f"端口{port}: 功耗 = {varBind[1]} mW")
if __name__ == "__main__":
get_poe_power("192.168.1.100", "public")
批量配置PoE优先级(使用SSH/CLI)
适合不能使用SNMP的环境,通过SSH发送命令行。
实用脚本示例(Python + Paramiko):
import paramiko
def batch_poe_config(switch_ip, username, password, ports, action):
"""action: 'power inline never' / 'power inline auto' (Cisco语法)"""
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(switch_ip, username=username, password=password)
commands = ["configure terminal"]
for port in ports:
int_cmd = f"interface gigabitEthernet 1/0/{port}"
poe_cmd = f"power inline {action}"
commands.extend([int_cmd, poe_cmd])
commands.append("end")
commands.append("write memory")
full_cmd = "\n".join(commands)
stdin, stdout, stderr = client.exec_command(full_cmd)
output = stdout.read().decode()
error = stderr.read().decode()
client.close()
return output, error
# 使用示例:禁用端口1-8的PoE
result, err = batch_poe_config("192.168.1.100", "admin", "password", range(1,9), "never")
print(result)
- 注意: 不同厂商命令不同(Cisco:
power inline/ H3C:poe enable/ Huawei:poe power)
批量发送PoE事件告警(监控PD设备掉线)
监控特定端口的PoE状态变化(如PD设备被拔出),触发告警。
实用脚本(Bash + snmptrap):
#!/bin/bash
# 持续监控PoE状态变更Trap (需配置snmp trap接收)
LOG_FILE="/var/log/poe_alerts.log"
while read trap_line; do
# 解析trap消息,提取端口和状态
port=$(echo "$trap_line" | grep -oP 'Port \K\d+')
status=$(echo "$trap_line" | grep -oP '(enabled|disabled)')
if [ ! -z "$port" ]; then
echo "$(date) - 端口 ${port} PoE 变为 ${status}" >> $LOG_FILE
# 发送邮件告警
echo "交换机PoE变更: 端口${port} ${status}" | \
mail -s "PoE告警" admin@yourcompany.com
fi
done < <(snmptrapd -f -Lo -c /etc/snmp/snmptrapd.conf)
关键注意事项:
-
确定交换机型号和OID:不同厂商(Cisco、H3C、Huawei、Dell)的PoE SNMP OID和CLI命令完全不同,建议先在一台设备上手动验证。
-
安全风险:批量关闭PoE会导致连接的设备(IP电话、AP、监控摄像头)掉电,建议:
- 先获取当前设备列表
- 分批次操作(如每次5个端口)
- 考虑设置自动恢复机制
-
逐行处理:PoE操作通常是逐端口进行的,没有标准的“批量”API,脚本需要循环执行。
-
推荐工具:
- 如果管理Cisco企业交换机:Ansible的
ios_config模块非常高效 - 如果管理小型网络:Netmiko库(Python)比Paramiko更友好
- 如果需要图形界面:PRTG或Zabbix的SNMP监控
- 如果管理Cisco企业交换机:Ansible的
最终建议
如果您只是偶尔进行批量操作,这些脚本完全足够,如果这是您日常运维的一部分,强烈建议使用Ansible搭配厂商特定的Playbook,它内置了幂等性和错误处理,比手写脚本更可靠。
请先告诉我您的交换机型号和具体想实现的功能(开启/关闭/监控/重置),我可以提供更精确的OID和命令模板。