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

方法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();
}
}
}
注意事项
- 权限问题:某些方法可能需要root权限才能获取所有网络接口的信息
- 虚拟接口:上述方法可能会返回虚拟网络接口(如docker0、virbr0等)的MAC地址,你可能需要过滤掉这些
- 多网卡系统:服务器可能有多个网卡,你需要确定获取的是哪个网卡的MAC地址
- 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方法是最推荐的,因为它不依赖外部命令且跨平台性更好。
