远程执行brctl命令提取MAC地址遇AttributeError问题求助
解决Paramiko提取brctl MAC地址时的AttributeError错误
错误原因
re.search()会对不匹配正则的行返回None,而你直接对None调用.group()方法,这就导致了AttributeError。brctl showmacs br0的输出里大部分行(比如表头、port 2的条目)都不符合你的正则模式,因此触发了该错误。
修复方案
- 先检查匹配结果再调用
.group(): 在提取分组前,必须确认re.search()返回了有效的匹配对象。 - 使用灵活的空格匹配: 把正则里固定的空格数(
\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
相关产品推荐
相关产品推荐

