2014-10-05 77 views
1

我注意到,与python-nmap,我可以做到这一点:除非你运行它作为根如何从附近的主机,在Python中检索MAC地址?

$ python 
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import nmap 
>>> n = nmap.PortScanner() 
>>> n.scan(hosts='192.168.1.0/24', arguments='-sP') 
{'nmap': {'scanstats': {'uphosts': u'6', 'timestr': u'Sat Oct 4 21:10:10 2014', 'downhosts': u'250', 'totalhosts': u'256', 'elapsed': u'2.69'}, 'scaninfo': {}, 'command_line': u'nmap -oX - -sP 192.168.1.0/24'}, 'scan': {u'192.168.1.104': {'status': {'state': u'up', 'reason': u'conn-refused'}, 'hostname': u'Mikes-MBP', 'addresses': {u'ipv4': u'192.168.1.104'}}, u'192.168.1.131': {'status': {'state': u'up', 'reason': u'conn-refused'}, 'hostname': u'Aidana', 'addresses': {u'ipv4': u'192.168.1.131'}}, u'192.168.1.133': {'status': {'state': u'up', 'reason': u'conn-refused'}, 'hostname': u'vm-trusty-desktop', 'addresses': {u'ipv4': u'192.168.1.133'}}, u'192.168.1.135': {'status': {'state': u'up', 'reason': u'conn-refused'}, 'hostname': u'android-d79f5b3256db8e11', 'addresses': {u'ipv4': u'192.168.1.135'}}, u'192.168.1.1': {'status': {'state': u'up', 'reason': u'syn-ack'}, 'hostname': '', 'addresses': {u'ipv4': u'192.168.1.1'}}, u'192.168.1.129': {'status': {'state': u'up', 'reason': u'syn-ack'}, 'hostname': u'DiskStation', 'addresses': {u'ipv4': u'192.168.1.129'}}}} 
>>> n.all_hosts() 
[u'192.168.1.1', u'192.168.1.104', u'192.168.1.129', u'192.168.1.131', u'192.168.1.133', u'192.168.1.135'] 

但是NMAP不会咳嗽​​了MAC地址。但是,当我关闭Python会话时,我可以立即运行arp -an并获取所有找到的主机及其相应MAC地址的转储。

有没有干净的方式来获得这些数据直接在Python中,没有

  1. 需要root权限,或
  2. 不必手动解析arp输出?

谢谢。

+0

FWIW,我的系统(Mepis的11)上我需要以root运行'arp'。 – 2014-10-05 03:15:15

+0

有趣,感谢您的信息。在Ubuntu和Mac OS X上,默认配置都允许'arp'作为非特权用户运行。 – mikepurvis 2014-10-05 19:07:49

+0

早期版本的Mepis(可能)允许它,但是这不是;除非你是root用户,否则你甚至不能运行'ifconfig'。 Mepis默认不启用'sudo',你必须使用'su'。 OTOH,我也运行Puppy Linux,以root身份运行是非常正常的。 :) – 2014-10-06 13:08:28

回答

2

在Python-,nmap的example.py:

# Vendor list for MAC address 
nm.scan('192.168.0.0/24', arguments='-O') 
for h in nm.all_hosts(): 
    if 'mac' in nm[h]['addresses']: 
     print(nm[h]['addresses'], nm[h]['vendor']) 
+1

只有当整个程序以root身份运行时才会填充“mac”字段。 – mikepurvis 2014-10-05 11:56:59

相关问题