如何从 Linux 命令输出中安全提取特定 MAC 地址

霞舞

霞舞

2026-07-22

442人浏览

原创

如何从 Linux 命令输出中安全提取特定 MAC 地址

本文讲解如何使用 python(配合 paramiko)远程执行 brctl showmacs br0 并精准提取 port 为 1、状态为 "no" 的 mac 地址,重点解决正则匹配失败导致的 attributeerror 问题。

本文讲解如何使用 python(配合 paramiko)远程执行 brctl showmacs br0 并精准提取 port 为 1、状态为 "no" 的 mac 地址,重点解决正则匹配失败导致的 attributeerror 问题。

在自动化运维或网络设备管理场景中,常需远程解析 Linux 桥接表(bridge forwarding database)输出,提取特定端口(如 port 1)关联的非本地(is local? 为 no)MAC 地址。原始代码直接调用 .group(1) 导致崩溃,根本原因是 re.search() 在未匹配时返回 None,而 None.group(1) 触发 AttributeError。

正确做法是始终检查正则匹配结果是否为 None,再进行分组提取。以下是优化后的完整实现:

import paramiko
import re

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


def lan0_mac():
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        client.connect(hostname, port, username, password, timeout=10)
        stdin, stdout, stderr = client.exec_command("brctl showmacs br0")

        # 读取所有输出行(跳过表头)
        lines = stdout.readlines()
        mac_addresses = []

        for line in lines[1:]:  # 跳过首行标题
            line = line.strip()
            if not line:
                continue

            # 更健壮的正则:匹配 port=1、MAC字段、is local?=no(支持空格对齐变化)
            # 示例匹配:'  1     50:d4:f7:5e:xx:xx       no                 7.97'
            match = re.search(r'^\s*\d+\s+1\s+([0-9a-fA-F]{2}[:-][0-9a-fA-F]{2}[:-][0-9a-fA-F]{2}[:-][0-9a-fA-F]{2}[:-][0-9a-fA-F]{2}[:-][0-9a-fA-F]{2})\s+no\b', line)
            if match:
                mac = match.group(1).lower()  # 统一转小写,便于后续处理
                mac_addresses.append(mac)
                print(mac)

        return mac_addresses

    except Exception as e:
        print(f"SSH 或解析异常: {e}")
        return []
    finally:
        client.close()


# 调用示例
if __name__ == "__main__":
    result = lan0_mac()
    print(f"\n共找到 {len(result)} 个符合条件的 MAC 地址")

关键改进点说明:

Go语言(Golang)Linux版
Go语言(Golang)Linux版

Go语言(Golang)Linux版适合在 Linux 环境中部署 Go 编译工具链,支持服务端开发、微服务、网络程序、容器化项目和自动化工具开发。

下载
  • 防御性编程:先判断 match 是否存在,避免 None.group() 错误;
  • 跳过表头:lines[1:] 忽略首行列名,提升鲁棒性;
  • 增强正则容错性:使用 ^\s*\d+\s+1\s+... 匹配任意前导空格与端口号位置,兼容不同终端宽度下的对齐差异;
  • 异常处理与资源清理:包裹 try/except/finally,确保连接总能关闭;
  • 标准化输出:.lower() 统一 MAC 格式,适配后续比对或存储需求。

⚠️ 注意事项:

  • brctl 已被 iproute2 中的 bridge fdb 取代,生产环境建议迁移到 bridge fdb show dev br0(输出格式更结构化);
  • 若目标主机启用 SSH 密钥认证,请改用 client.connect(..., key_filename="/path/to/private_key");
  • 正则中 [:-] 同时支持冒号 : 和短横 - 分隔符(常见于不同内核版本),但实际 brctl 输出通常为 :,可根据实际情况精简为 :。

通过以上改造,脚本不再因某行不匹配而中断,可稳定提取所有 port 1 且非本地的 MAC 地址,适用于批量设备巡检与配置核查场景。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1104

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

2072

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1185

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

8798

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1479

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1551

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

881

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

530

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 安装文档
phpMyAdmin 安装文档

共0课时 | 0人学习

Apifox下载与安装手册
Apifox下载与安装手册

共0课时 | 0人学习

安装 Xdebug 并配置 phpstorm
安装 Xdebug 并配置 phpstorm

共1课时 | 128人学习