在linux用java根据ip获得mac地址?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在linux用java根据ip获得mac地址?相关的知识,希望对你有一定的参考价值。

找了很多地方实在找不到了,求高手帮忙给段java代码,可以在Linux下获取客户端mac地址的代码,感激不尽,在线等待。。。急。

try 
  ip = 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地址、工作组?

Linux网络基础番外篇(IPMACTCP)

java如何查询本机ip地址和mac地址

Oracle中客户端连接的MAC和IP地址

获取ip地址对应的mac地址,c/c++编程实现,linux下

java工具类,在Windows,Linux系统获取电脑的MAC地址本地IP电脑名