在linux用java根据ip获得mac地址?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在linux用java根据ip获得mac地址?相关的知识,希望对你有一定的参考价值。
找了很多地方实在找不到了,求高手帮忙给段java代码,可以在Linux下获取客户端mac地址的代码,感激不尽,在线等待。。。急。
tryip = InetAddress.getLocalHost();
NetworkInterface network = NetworkInterface.getByInetAddress(ip);
if (network != null)
byte[] mac = network.getHardwareAddress();
if(mac != null)
System.out.print("MAC address : ");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++)
sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
System.out.println(sb.toString());
catch (UnknownHostException e)
e.printStackTrace();
catch (SocketException e)
e.printStackTrace();
参考技术A 调linux命令:arp <ip地址>
返回字符串中截取mac地址
如何在 Linux 中 ping MAC 地址
【中文标题】如何在 Linux 中 ping MAC 地址【英文标题】:How to ping MAC address in Linux 【发布时间】:2013-01-14 01:26:24 【问题描述】:我想ping一个已知的MAC地址,我尝试使用nmap:
sudo nmap -sP 192.168.15.1/24 | grep 20:64:32:3F:B1:A9
但在这种情况下,它会 ping 所有 255 个 IP 地址(从 192.168.15.1 到 192.168.15.255)直到获得我的 MAC 地址,这需要大约 4 秒的时间!
有什么想法吗?
【问题讨论】:
【参考方案1】:让它更快的唯一方法是测试mac地址是否已经在你的arp表中
#!/bin/bash
# extract ip from local arp table
ip=$(arp | grep 20:64:32:3F:B1:A9 | awk ' print $1 ')
# found an ip tied to the mac address?
if [ ! -z $ip ]; then
# if found, do you want to ping it?
ping $ip
else
echo "Not found into local arp table. Trying another way..."
# wanna try your nmap strategy?
# sudo nmap -sP 192.168.15.1/24 | grep 20:64:32:3F:B1:A9
fi;
【讨论】:
想回复,代码不起作用,它给了我:用法:ping [-LRUbdfnqrvVaAD] [-c count] [-i interval] [-w deadline] [-p pattern] [-s packetsize] [-t ttl] [-I interface] [-M pmtudisc-hint] [-m mark] [-S sndbuf][-T tstamp-options] [-Q tos] [hop1 ...]目的地 好的,这是一个很好的解决方案和它的工作,但它总是给我“找不到本地 arp 表。尝试另一种方式......”即使我使用了另一个 mac 地址,而两者都找到了在本地网络中!这意味着mac地址不在arp表中。如何将其插入表中?我用 sudo nmap -sP 192.168.15.1/24 | grep 20:64:32:3F:B1:A9,但它仍然不在 arp 表中? 我通过sudo arp -s 192.168.15.196 20:64:32:3F:B1:A9添加了mac地址,不知道这样对不对。我觉得应该加自动,因为在本地网络中找到了 mac 地址,但无论如何,你的脚本现在工作得很好。感谢您的解决方案。 使用 "arp -n" 会快很多,从 17.0 秒到 0.003 秒【参考方案2】:您无法 ping MAC 地址。您只能 ping 一个 IP 地址,因此您要做的是找出属于某个 MAC 地址的 IP 地址并 ping 该 IP。 ARP 用于查找具有特定 IP 地址的机器的 MAC 地址,但您不能真正反过来(技术上存在称为 Reverse ARP 的协议,但在典型的操作系统中从未使用过)。找到 MAC 地址后,它将保存在 ARP 缓存中,因此您不必在几分钟内再次查找它,但这不是找到 MAC 地址的可靠方法,因为条目不会留在缓存长。您已经知道如何创建静态条目,但如果您将 192.168.15.196 硬编码到该 MAC 地址,为什么不直接 ping 192.168.15.196(这就是您要做的全部)?
【讨论】:
【参考方案3】:nmap 有 -T 选项来加速这样的事情。 -T 5 是最快的。
您也可以尝试 --min-parallelism 选项。
【讨论】:
【参考方案4】:将上述好的答案组合成一个脚本:
(用法:macping aa:bb:cc:dd:ee:ff
)
#!/bin/bash
network=192.168.1.1/24
if [ "$#" -ne 1 ]; then echo Usage example: $0 aa:bb:cc:dd:ee:ff; exit 2; fi;
nmap -sP -T4 $network >& /dev/null
ip=$(arp -n | grep $1 | awk ' print $1 ')
ping $ip -n -q -c 2 -i 0.2 -w 1 >& /dev/null
if [ $? -eq 0 ]; then
echo Device is online \($ip\)
else
echo Device is offline
exit 1
fi;
扩展:通过mac地址维护网络设备列表,并显示每个设备的在线/离线状态。 用途包括:
监控您的服务器状态 检查您的互联网连接是否正常 检查特定设备是否已连接到您的 wifi 检查您的智能电视确实关闭 等在线时每个设备名称显示为绿色,离线时显示为红色。 设备状态更改时会显示桌面通知。
在 linux mint 下测试,应该可以在其他发行版上运行。
#!/bin/bash
#Create associated array's
declare -A devicelist #device name: mac address
declare -A statuslist #device name: online status
devicelist[Server01]=aa:bb:cc:dd:ee:01
devicelist[Server02]=aa:bb:cc:dd:ee:02
devicelist[MyPhone] =aa:bb:cc:dd:ee:03
devicelist[SmartTV] =aa:bb:cc:dd:ee:04
#Colour Constants
BRed='\033[1;31m'
BGreen='\033[1;32m'
Reset='\033[m'
function mactoip()
echo $(arp -n | grep -i $mac | awk ' print $1 ')
while [ true ]; do
clear
arp_cache_rebuilt=no
for devicename in $!devicelist[@]; do
status=OFFLINE
mac=$devicelist[$devicename]
ip=$( mactoip $mac )
if [ -z $ip ] && [ $arp_cache_rebuilt = "no" ]; then
#we need to rebuild the arp cache...
nmap -sn -T4 192.168.1.0/24 >& /dev/null
ip=$( mactoip $mac )
arp_cache_rebuilt=yes
fi;
if [ ! -z $ip ]; then
ping $ip -n -q -c 2 -i 0.2 -w 1 >& /dev/null
if [ $? -eq 0 ]; then status=ONLINE; fi
fi;
#if device's previous status not yet recorded, then set it now.
if [ ! $statuslist[$devicename]+_ ]; then statuslist[$devicename]=$status; fi
if [ $status = "ONLINE" ]; then colour=$BGreen; else colour=$BRed; fi;
echo -e $colour$devicename$Reset - $ip
if [ $statuslist[$devicename] != $status ]; then
notify-send -i ac-adapter -u critical -t 1000 $status "$devicename"
fi;
statuslist[$devicename]=$status
done
echo -
sleep 5
done
【讨论】:
好东西,对于监控谁在我的网络上连接非常有用。现在...我通过 *** 连接到我公司的网络:有没有办法让这个arp
魔法在远程网络上工作?我尝试了一点,到目前为止没有成功。
由于我经常在这里和那里复制和粘贴终端内容,因此在传输过程中颜色往往会消失。因此,我稍微修改了您的脚本以应对色盲和文本复制粘贴:我只是将颜色的定义替换为如下:` BRed='\033[1;31m [ OFF ] ' BGreen='\033[1 ;32m [ ON ] ' ` 我还在循环的开头更改了clear
,为echo "_________________________________________"
,我猜只是口味问题...
nmap 需要--send-ip
才能更新系统 ARP 表。【参考方案5】:
这是另一个更简单的答案。
ping $(arp-scan --localnet | grep 80:1f:02:fa:90:b7 | awk ' printf $1 ')
注意mac地址必须使用小写字母。
arp-scan 似乎比 arp 运行得快很多。
【讨论】:
以上是关于在linux用java根据ip获得mac地址?的主要内容,如果未能解决你的问题,请参考以下文章
java 怎样利用IP地址获得局域网计算机的名字、mac地址、工作组?