杰瑞科技汇

Java如何获取Linux系统的MAC地址?

在Java中获取Linux系统的MAC地址

在Java中获取Linux系统的MAC地址有几种方法,以下是几种常用的实现方式:

Java如何获取Linux系统的MAC地址?-图1
(图片来源网络,侵删)

方法1:使用NetworkInterface类(推荐)

import java.net.NetworkInterface;
import java.util.Collections;
import java.util.Enumeration;
public class GetMacAddress {
    public static void main(String[] args) {
        try {
            Enumeration<NetworkInterface> networks = NetworkInterface.getNetworkInterfaces();
            for (NetworkInterface network : Collections.list(networks)) {
                byte[] mac = network.getHardwareAddress();
                if (mac != null && mac.length > 0) {
                    StringBuilder sb = new StringBuilder();
                    for (byte b : mac) {
                        sb.append(String.format("%02X:", b));
                    }
                    if (sb.length() > 0) {
                        sb.deleteCharAt(sb.length() - 1); // 移除最后的冒号
                    }
                    System.out.println("Interface: " + network.getName() + 
                                     " Display Name: " + network.getDisplayName() + 
                                     " MAC: " + sb.toString());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方法2:执行Linux命令获取MAC地址

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class GetMacAddressLinux {
    public static void main(String[] args) {
        try {
            Process process = Runtime.getRuntime().exec("ifconfig");
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                if (line.contains("HWaddr") || line.contains("ether")) {
                    // 处理不同Linux发行版的输出格式
                    String[] parts = line.split("\\s+");
                    for (String part : parts) {
                        if (part.matches("([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})")) {
                            System.out.println("MAC Address: " + part);
                            break;
                        }
                    }
                }
            }
            process.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方法3:使用ip命令(现代Linux系统)

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class GetMacAddressIpCommand {
    public static void main(String[] args) {
        try {
            Process process = Runtime.getRuntime().exec("ip link show");
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                if (line.contains("link/ether")) {
                    String[] parts = line.split("\\s+");
                    for (String part : parts) {
                        if (part.matches("([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})")) {
                            System.out.println("MAC Address: " + part);
                            break;
                        }
                    }
                }
            }
            process.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意事项

  1. 权限问题:某些方法可能需要root权限才能获取所有网络接口的信息
  2. 虚拟接口:上述方法可能会返回虚拟网络接口(如docker0、virbr0等)的MAC地址,你可能需要过滤掉这些
  3. 多网卡系统:服务器可能有多个网卡,你需要确定获取的是哪个网卡的MAC地址
  4. Java安全策略:如果运行在受限环境中,可能需要调整Java安全策略

过滤特定网卡的示例

如果你只想获取特定网卡(如eth0)的MAC地址:

import java.net.NetworkInterface;
public class GetSpecificMac {
    public static void main(String[] args) {
        try {
            NetworkInterface network = NetworkInterface.getByName("eth0");
            if (network != null) {
                byte[] mac = network.getHardwareAddress();
                if (mac != null) {
                    StringBuilder sb = new StringBuilder();
                    for (byte b : mac) {
                        sb.append(String.format("%02X:", b));
                    }
                    if (sb.length() > 0) {
                        sb.deleteCharAt(sb.length() - 1);
                    }
                    System.out.println("eth0 MAC: " + sb.toString());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

选择哪种方法取决于你的具体需求和运行环境。NetworkInterface方法是最推荐的,因为它不依赖外部命令且跨平台性更好。

分享:
扫描分享到社交APP
上一篇
下一篇