Java - 获取Linux系统的MAC地址

Posted

技术标签:

【中文标题】Java - 获取Linux系统的MAC地址【英文标题】:Java - Getting MAC address of Linux system 【发布时间】:2011-09-29 13:02:31 【问题描述】:

我正在尝试使用此代码获取 linux 系统的 MAC 地址:

try 
  ip = InetAddress.getLocalHost();
  NetworkInterface network = NetworkInterface.getByInetAddress(ip);
  byte[] mac = network.getHardwareAddress();
  // System.out.print("Current MAC address: ");
  for (int i = 0; i < mac.length; i++) 
    is = is + Integer.parseInt(
      String.format("%02X%s", mac[i], (i < mac.length - 1) ? "" : ""),16);
  
 catch (UnknownHostException e) 
  e.printStackTrace();
 catch (SocketException e) 
  e.printStackTrace();

但它只是崩溃了......有人知道为什么吗?

【问题讨论】:

当它崩溃时你会得到什么错误信息? pastebin.com/891wKcXz 是的,我已经检查过它是这部分。如果我只是把 is = is + Integer.parseInt([mac address here],16);代码工作正常 byte[] mac = network.getHardwareAddress(); “系统”没有 MAC 地址。网络接口可以。您可以在一个系统中拥有多个 NIC,因此也可以拥有多个 MAC 地址。 【参考方案1】:

您可能有多个网络接口,我不会指望接口的名称。我建议您检查所有接口并查找具有 MAC 地址的接口。 您可以将此示例用作基线:

try 

        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
        while(networkInterfaces.hasMoreElements())
        
            NetworkInterface network = networkInterfaces.nextElement();
            System.out.println("network : " + network);
            byte[] mac = network.getHardwareAddress();
            if(mac == null)
            
                System.out.println("null mac");             
            
            else
            
                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());  
                break;
            
        
     catch (SocketException e)

        e.printStackTrace();

    

【讨论】:

【参考方案2】:

从您的 cmets 看来,network 显然是 null,这意味着 getByInetAddress() 找不到具有该 IP 地址的接口(请参阅 JavaDocs:http://download.oracle.com/javase/1.5.0/docs/api/java/net/NetworkInterface.html#getByInetAddress(java.net.InetAddress)。

【讨论】:

-facepalm,做了 NetworkInterface network = NetworkInterface.getByName("eth0");它立即起作用。谢谢大家:D 仅供参考includehelp.com/java-programs/…【参考方案3】:

只是对Guy的代码进行了小修改:

public String searchForMac() throws SocketException 
    String firstInterface = null;        
    Map<String, String> addressByNetwork = new HashMap<>();
    Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();

    while(networkInterfaces.hasMoreElements())
        NetworkInterface network = networkInterfaces.nextElement();

        byte[] bmac = network.getHardwareAddress();
        if(bmac != null)
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < bmac.length; i++)
                sb.append(String.format("%02X%s", bmac[i], (i < bmac.length - 1) ? "-" : ""));        
            

            if(sb.toString().isEmpty()==false)
                addressByNetwork.put(network.getName(), sb.toString());
                System.out.println("Address = "+sb.toString()+" @ ["+network.getName()+"] "+network.getDisplayName());
            

            if(sb.toString().isEmpty()==false && firstInterface == null)
                firstInterface = network.getName();
            
        
    

    if(firstInterface != null)
        return addressByNetwork.get(firstInterface);
    

    return null;

此代码已在 Windows、Linux (Ubuntu) 和 Mac OS X 上成功测试。

因为网络可以为空,所以我忽略所有空的情况,也忽略空地址。我认为,如果我们不这样做,我们就会看到崩溃。我选择了第一个找到的地址,它可以工作,但它可能是错误的,所以只需测试它。

【讨论】:

以上是关于Java - 获取Linux系统的MAC地址的主要内容,如果未能解决你的问题,请参考以下文章

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

获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址(服务器端)

PHP获取MAC地址的函数代码

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

linux查mac地址命令

获取 MAC 地址