使用Python和Linux获取远程MAC地址

我如何获得我的局域网上的远程主机的MAC地址? 我正在使用Python和Linux。

你可以尝试运行命令arp -a

这里是几个关于Mac地址抓取的链接(未经测试)

在Linux / Unix中,arping,

http://www.ibm.com/developerworks/aix/library/au-pythocli/

在Windows中,通过ctypes使用IP Helper API

http://code.activestate.com/recipes/347812/

使用这些命令:

 arp -n <IP Address>|awk '/<ip address>/ {print $3}' 

例如,如果你想要192.168.10.1的MAC地址:

 #arp -n 192.168.10.1|awk '/192.168.10.1/ {print $3}' #00:0c:29:68:8f:a4 

ARP条目可能永远不会是正确的,我试图ping主机多次,但ARP -A不会给我这是MAC /以太网地址。 (不用担心从活动状态的BTW代码)

Linux(和* nix)上的可靠方法是使用arping或scappy(请参阅http://en.wikipedia.org/wiki/Arping ),然后解析输出。 这是我使用的代码。 你必须是root或使用sudo运行arping。

 cmd = '/sbin/arping -c 1 ' + remotehost p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) output, errors = p.communicate() if output is not None : mac_addr = re.findall(r'(\[.*\])', output)[0].replace('[', '').replace(']', '') 

如果你只是想查询操作系统的arp缓存,合理的最新的linux内核支持:

 import os, sys host = sys.argv[1] # ping is optional (sends a WHO_HAS request) os.popen('ping -c 1 %s' % host) # grep with a space at the end of IP address to make sure you get a single line fields = os.popen('grep "%s " /proc/net/arp' % host).read().split() if len(fields) == 6 and fields[3] != "00:00:00:00:00:00": print fields[3] else: print 'no response from', host 

多年前,我负责收集企业园区内所有机器的各种机器信息。 一个需要的信息是MAC地址,在跨越多个子网的网络上很难获得。 当时,我使用了Windows内置的“nbtstat”命令。

今天有一个名为“nbtscan”的Unix工具提供了类似的信息。 如果你不想使用外部工具,也许有用于Python的NetBIOS库,可以用来收集你的信息?

你可以在win32或linux上使用它

 import subprocess import sys remotehost="192.168.0.122" cmd="arp -a" p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) output, errors = p.communicate() if output is not None : if sys.platform in ['linux','linux2']: for i in output.split("\n"): if remotehost in i: for j in i.split(): if ":" in j: print "%s--> %s" % (remotehost,j) elif sys.platform in ['win32']: item = output.split("\n")[-2] if remotehost in item: print "%s--> %s" %(remotehost, item.split()[1]) 

注意:一段时间之后,arp条目会消失,您需要“泛滥您的网络”(例如ping),以便arp -a显示您的远程主机。

嗨,这是一个快速修复python3

 import subprocess import sys remotehost="192.168.0.122" cmd="arp -a" p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) output, errors = p.communicate() if output is not None : output = output.decode('ascii') if sys.platform in ['linux','linux2']: for i in output.split("\n"): if remotehost in i: for j in i.split(): if ":" in j: print( "%s--> %s" % (remotehost,j)) elif sys.platform in ['win32']: item = output.split("\n")[-2] if remotehost in item: print("%s--> %s" %(remotehost, item.split()[1]))