我如何获得我的局域网上的远程主机的MAC地址? 我正在使用Python和Linux。
你可以尝试运行命令arp -a
这里是几个关于Mac地址抓取的链接(未经测试)
在Linux / Unix中,arping,
http://www.ibm.com/developerworks/aix/library/au-pythocli/
在Windows中,通过ctypes使用IP Helper API
使用这些命令:
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]))