【Python】通过网卡(网桥)名称获取mac地址,针对多网卡情况

本文介绍了在Python中获取单网卡和多网卡MAC地址的方法,包括使用UUID库和执行shell命令来获取特定网卡的MAC地址。
AI助手已提取文章相关产品:

一个简单的方法:

>>> import uuid
>>> node = uuid.getnode()
>>> mac = uuid.UUID(int=node)
>>> addr = mac.hex[-12:]
>>> addr


但是对于多网卡呢?下面的可以用:
法一:
>>> import os
>>> mac = os.popen("/sbin/ifconfig | grep 'br0'|awk '{print $5}'").read()
>>> mac
'00:1b:cd:03:10:ac\n'
>>> mac = mac[mac.find(':')+1:mac.find('\n')]
>>> mac
'1b:cd:03:10:ac'
>>> mac = string.replace(mac,":","",4)
'1bcd0310ac'

法二:给出interface字符串形式,如interface = 'eth0'
import fcntl
import struct
import  socket
def get_interface_mac(interface):
    DEVICE_NAME_LEN = 15
    MAC_START = 18
    MAC_END = 24
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    info = fcntl.ioctl(s.fileno(), 0x8927,
                       struct.pack('256s', interface[:DEVICE_NAME_LEN]))
    return ''.join(['%02x:' % ord(char)
                    for char in info[MAC_START:MAC_END]])[:-1]



您可能感兴趣的与本文相关内容

<think>我们正在讨论的是在有线网络环境中,当电脑只有一张有线网卡时如何进行抓包。根据用户的问题,他可能想知道是否可以不选择网卡直接抓包,或者如何自动选择唯一的网卡。 根据之前的回答,我们知道Scapy可以自动选择唯一的有线网卡。但是,用户现在又提供了一些引用,其中引用[1]提到了无线网络抓包需要monitor模式,而有线网络则简单得多。引用[2]提到了在Windows下通过Wpcap抓包实现桥接,引用[3]介绍了一些网络术语,引用[4]介绍了网络工具Tcpreplay。 结合用户的问题和引用,我们可以这样回答: 1. 在有线网络中,如果只有一张有线网卡,抓包可以直接进行,因为不需要像无线网络那样设置monitor模式(引用[1])。 2. 在Windows和Linux系统中,都可以使用相应的工具(如Wireshark、tcpdump、Scapy)进行抓包,而且这些工具通常会自动选择活动的网卡(引用[4]中提到了tcpdump和Wireshark)。 3. 使用Scapy时,我们可以按照之前的方法自动选择网卡,或者不指定网卡(使用默认网卡)。 因此,我们可以这样组织回答: - 首先,说明在有线网络中抓包相对简单,不需要特殊模式。 - 其次,介绍在不同系统中如何抓包(包括命令行工具和图形界面工具)。 - 然后,重点介绍使用Scapy自动选择网卡的方法(可以复用之前的代码)。 - 最后,给出一些注意事项。 同时,我们还可以引用用户提供的引用[1]和[4]来支持我们的观点。 注意:用户提供的引用[2]和[3]与当前问题关系不大,可以忽略。 下面开始回答:</think>在只有一张有线网卡的电脑上进行网络抓包是完全可行的,且操作比无线抓包更简单。以下是具体方法和工具说明: ### 一、核心原理 1. **有线抓包优势**: 有线网络抓包不需要像无线网络那样设置 monitor 模式[^1],直接通过网卡即可捕获本机流量和局域网广播流量。 2. **混杂模式(Promiscuous Mode)**: 启用后网卡可接收所有经过的流量(包括非本机数据),通过命令开启: ```bash sudo ip link set eth0 promisc on # Linux netsh interface set interface "Ethernet" promiscuous=enabled # Windows ``` ### 二、抓包方法 #### 方法1:使用 Wireshark(图形界面) 1. 启动 Wireshark 2. 系统会自动选择唯一有线网卡(如 `Ethernet` 或 `eth0`) 3. 点击"Start"直接捕获数据包 ![Wireshark界面](https://example.com/wireshark.png) # 图示自动选择的网卡 #### 方法2:使用 tcpdump(命令行) ```bash # Linux/macOS tcpdump -i eth0 -w capture.pcap # Windows(需安装WinPcap) tcpdump -D # 查看网卡编号 tcpdump -i 1 -w capture.pcap ``` #### 方法3:使用 Scapy(Python 脚本) ```python from scapy.all import * def packet_handler(pkt): if pkt.haslayer(IP): print(f"捕获IP包: {pkt[IP].src} -> {pkt[IP].dst}") # 自动选择唯一有线网卡 sniff(prn=packet_handler, store=0, timeout=30) ``` ### 三、特殊场景处理 | 场景 | 解决方案 | |------|----------| | 抓取本机发往自身的包 | 使用环回接口 `lo` (Linux) 或 `Loopback` (Windows) | | 抓取虚拟机流量 | 在宿主机抓物理网卡,或虚拟机内抓虚拟网卡 | | 抓取 Docker 容器流量 | 在主机抓 `docker0` 网桥流量 | ### 四、验证抓包有效性 1. **测试工具**: ```bash ping 8.8.8.8 # 生成ICMP流量 curl http://example.com # 生成TCP流量 ``` 2. **在抓包结果中检查**: - ICMP 请求/响应包 - TCP 三次握手过程 - DNS 查询记录 ### 五、最佳实践建议 1. **过滤无关流量**(提升效率): ```bash tcpdump -i eth0 tcp port 80 # 只抓HTTP流量 ``` 2. **保存分析**: ```bash tcpdump -i eth0 -s0 -w full_capture.pcap # 保存原始数据 ``` 3. **回放测试**: 使用 Tcpreplay[^4] 重放抓包文件: ```bash tcpreplay -i eth0 full_capture.pcap ``` > 💡 **关键提示**:单网卡抓包无法直接捕获*其他主机间*的流量(需端口镜像或网络分光)。但在家庭网络/小型办公环境中,广播流量和本机通信足以分析大多数网络问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值