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

时间:2010-01-06 03:40:28

标签: python linux networking mac-address

如何在LAN上获取远程主机的MAC地址?我正在使用Python和Linux。

7 个答案:

答案 0 :(得分:4)

您可以尝试运行命令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/

答案 1 :(得分:3)

使用以下命令:

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

例如,如果您想要MAC地址为192.168.10.1:

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

答案 2 :(得分:2)

arp条目可能永远不对,我试图多次ping一个主机,但arp -a不会给我它的mac / ethernet地址。 (不用担心活动状态下的Windows代码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(']', '')      

答案 3 :(得分:1)

如果你只是想查询操作系统的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

答案 4 :(得分:0)

许多年前,我的任务是收集公司校园内所有机器的各种机器信息。一个期望的信息是MAC地址,这很难在跨越多个子网的网络上获得。当时,我使用Windows内置的“nbtstat”命令。

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

答案 5 :(得分:0)

你可以在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就会显示你的远程主机。

答案 6 :(得分:0)

嗨,这是对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]))