You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

远程执行brctl命令提取MAC地址遇AttributeError问题求助

解决Paramiko提取brctl MAC地址时的AttributeError错误

错误原因

re.search()会对不匹配正则的行返回None,而你直接对None调用.group()方法,这就导致了AttributeError。brctl showmacs br0的输出里大部分行(比如表头、port 2的条目)都不符合你的正则模式,因此触发了该错误。

修复方案

  1. 先检查匹配结果再调用.group(): 在提取分组前,必须确认re.search()返回了有效的匹配对象。
  2. 使用灵活的空格匹配: 把正则里固定的空格数(\s{5}、\s{7})替换为\s+(匹配一个或多个空格),以兼容输出中可能存在的可变间距。

修正后的代码

import paramiko
import re

hostname = "192.168.88.79"
port = 22
username = "admin"
password = "password"


def lan0_mac():
    s = paramiko.SSHClient()
    s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    s.connect(hostname, port, username, password)
    command = "brctl showmacs br0"
    stdin, stdout, stderr = s.exec_command(command)
    
    # 适配可变间距的正则表达式
    pattern = r'^\s*1\s+(([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2})\s+no'
    
    for line in stdout.readlines():
        match = re.search(pattern, line)
        if match:
            mac = match.group(1)
            print(mac)
    
    s.close()


lan0_mac()

正则说明

  • ^\s*1: 匹配以任意空白字符开头,后跟端口号1的行
  • \s+: 匹配一个或多个空格,处理列之间的可变间距
  • (([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}): 捕获MAC地址,支持冒号和连字符两种分隔符
  • \s+no: 确保"is local?"字段的值为"no"

这段代码会自动跳过不匹配的行(比如表头、port 2的条目),不会抛出错误,只会打印符合条件的MAC地址。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:15:04