Получить удаленный MAC-адрес с помощью Python и Linux - PullRequest
5 голосов
/ 06 января 2010

Как мне получить MAC-адрес удаленного хоста в моей локальной сети? Я использую Python и Linux.

Ответы [ 7 ]

4 голосов
/ 06 января 2010

Вы можете попробовать запустить команду arp -a

Вот несколько ссылок о захвате адресов Mac (не проверено)

В Linux / Unix, arping,

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

В Windows, используя IP Helper API через ctypes

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

3 голосов
/ 12 августа 2013

Используйте эти команды:

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 голосов
/ 30 января 2010

Записи arp могут никогда не быть правильными, я пытался пинговать хост несколько раз, но 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(']', '')      
1 голос
/ 13 февраля 2014

Если вы просто хотите запросить 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
0 голосов
/ 04 мая 2017

Привет, это быстрое решение для 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]))
0 голосов
/ 06 января 2010

вы можете использовать это либо на 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 показывал ваш удаленный хост.

0 голосов
/ 06 января 2010

Много лет назад мне было поручено собирать различную информацию о машинах со всех машин в корпоративном кампусе. Одним из полезных элементов информации был MAC-адрес, который трудно получить в сети, охватывающей несколько подсетей. В то время я использовал встроенную в Windows команду «nbtstat».

Сегодня существует утилита Unix под названием "nbtscan", которая предоставляет аналогичную информацию. Если вы не хотите использовать внешний инструмент, возможно, существуют библиотеки NetBIOS для python, которые можно использовать для сбора информации для вас?

...