多网IP探测-过滤无网关网卡

This commit is contained in:
qiminbao
2025-10-31 16:07:26 +08:00
parent c12efbf410
commit b433c8480e
@@ -251,6 +251,9 @@ public class AgentUtil {
return swapped;
}
// 存储网关信息:接口名 -> 网关IP
private static Map<String, String> gatewayMap = new HashMap<>();
// 正则表达式匹配:当前 IPxxx.xxx.xxx.xxx 来自于:中国 江苏省 南京市 电信
private static final String REGEX = "来自于:(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)";
/**
@@ -280,6 +283,12 @@ public class AgentUtil {
String name = ni.getName();
if (!isEthernetInterface(name)) continue;
// 检查是否“已连接”(物理链路状态)
if (!isInterfaceConnected(name)) continue;
// 检查IP4信息
if (getIPv4Address(ni).equals("N/A")) continue;
NetworkInterfaceInfo info = NetworkInterfaceInfo.builder()
.name(name)
.type("Ethernet")
@@ -390,6 +399,42 @@ public class AgentUtil {
return "N/A";
}
// 检查接口是否“已连接”(物理链路状态)
private static boolean isInterfaceConnected(String interfaceName) {
try {
String os = System.getProperty("os.name").toLowerCase();
Process process;
if (os.contains("win")) {
// Windows: 使用 wmic 检查网卡是否启用
process = Runtime.getRuntime().exec(
"wmic nic where \"NetEnabled=true\" get Name");
} else {
// Linux: 检查 operstate
process = Runtime.getRuntime().exec(
"cat /sys/class/net/" + interfaceName + "/operstate");
}
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
if (os.contains("win")) {
if (line.trim().equalsIgnoreCase(interfaceName)) {
return true;
}
} else {
return "up".equals(line.trim());
}
}
reader.close();
return false;
} catch (Exception e) {
System.err.println("无法检查接口状态: " + interfaceName);
return false; // 保守处理
}
}
/**
* 获取公网 IP
*/