LAN 上のリモート ホストの MAC アドレスを取得するにはどうすればよいですか? Python と Linux を使用しています。
7 に答える
コマンドの実行を試すことができます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/イーサネットアドレスが表示されませんでした。(アクティブ状態のWindowsコードで心配する必要はありません)
Linux(および* nix)で信頼できる方法は、arpingまたはscappy(http://en.wikipedia.org/wiki/Arpingを参照)を使用してから、出力を解析することです。これが私が使用したコードです。arpingを実行するには、rootになるか、sudoを使用する必要があります。
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(']', '')
OS の 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
何年も前に、私は企業キャンパスのすべてのマシンからさまざまなマシン情報を収集する任務を負っていました。必要な情報の 1 つは 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 にリモートホストが表示されます。