Как получить MAC-адреса от соседних хостов, в Python?

Я отмечаю, что с помощью python-nmap я могу сделать это:

$ 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-адреса, если вы не запустите его от имени пользователя root. И все же, когда я закрываю сеанс Python, я могу сразу запустить arp -an и получить дамп всех найденных хостов и их соответствующих MAC-адресов.

Есть ли чистый способ получить эти данные непосредственно в Python, без

  1. необходимость быть корнем, или
  2. необходимость вручную разобрать arp выход?

Благодарю.

1 ответ

Из example.py в python-nmap:

# 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'])

@mikepurvis верен в Linux, и я предполагаю, что Mac. Вам необходимо запустить python от имени пользователя root, чтобы получать информацию о Mac с помощью nmap. Установка в Windows, которую я только что попробовал на Server 2019, работала нормально, но моя учетная запись пользователя находится в группе администраторов.

Я разместил образец скрипта cli python в моем GitHub. В этом примере показано, как запустить python от имени пользователя root с помощью pyenv через сценарий оболочки.

Вот отрывок логики очистки информации с помощью nmap

#...
    nm = nmap.PortScanner()
    nm.scan(hosts='192.168.1.0/24', arguments='-sP')
    for ip in nm.all_hosts():
        host = nm[ip]
        mac = "-"
        vendorName = "-"
        if 'mac' in host['addresses']:
            mac = host['addresses']['mac']
            if mac in host['vendor']:
                vendorName = host['vendor'][mac]

        status = host['status']['state']
        rHost = {'ip': ip, 'mac': mac, 'vendor': vendorName, 'status': status}
        print(rHost)
#...
Другие вопросы по тегам