You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Node.js脚本使用正则表达式从netstat输出提取IP地址无结果问题

解决Node.js提取netstat输出中IP地址的问题

我来帮你排查一下问题所在,你的代码里有几个关键错误导致正则匹配失败,我们一步步来修正:

1. 子进程调用的错误

你用spawn传递>和输出文件路径作为netstat的参数,但>是Shell的重定向语法,默认情况下spawn不会启动Shell,所以这些参数会被netstat当成无效选项处理,根本不会生成你想要的out.txt文件(或者文件内容是空的/错误的)。

修正方式:

  • 要么开启Shell模式执行命令,让Shell处理重定向;
  • 更高效的方式是直接捕获netstat的标准输出,不需要写入文件再读取。

2. 正则表达式的语法与逻辑错误

你的正则/^([0-255]{1-3}\.)(3)[0-255]:[0-9]{1-4}*$/g存在多处问题:

  • 量词写法错误:{1-3}应该是{1,3}(用逗号分隔范围,不是减号);
  • IPv4匹配逻辑完全错误:(3)会匹配字符3,而不是重复3次IP段;同时[0-255]会匹配无效数值(比如256、000),需要用更严谨的IP段匹配规则;
  • 端口匹配错误:[0-9]{1-4}*中的*多余,且端口范围是0-65535,应该用{1,5};
  • 锚点使用错误:^和$要求整行完全匹配IP:端口,但netstat的每行包含协议、状态等其他内容,所以不能用整行锚点。

正确的IPv4:Port正则:

const ipPortRegex = /((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):[0-9]{1,5}/g;

3. 匹配结果的处理错误

matchAll返回的是迭代器对象,直接push到数组里得不到实际的匹配值;同时你的do-while循环逻辑有误,会导致无限循环或者无法正确收集结果。


修正后的完整代码(推荐直接捕获输出)

这种方式不需要写入文件,更高效:

const { spawn } = require("child_process");

// 严谨的IPv4:Port正则表达式
const ipPortRegex = /((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):[0-9]{1,5}/g;

// 启动netstat,开启Shell模式处理命令
const netstat = spawn("netstat", ["-n"], { shell: true, stdio: ["ignore", "pipe", "ignore"] });

let output = "";

// 收集标准输出数据
netstat.stdout.on("data", (chunk) => {
  output += chunk.toString("utf8");
});

netstat.on("close", (code) => {
  if (code !== 0) {
    console.error(`netstat执行失败,退出码:${code}`);
    return;
  }

  // 提取所有匹配的IP:Port
  const matches = [...output.matchAll(ipPortRegex)];
  // 提取每个匹配的完整值
  const ipPorts = matches.map(match => match[0]);
  
  console.log("提取到的IP:Port列表:");
  console.log(ipPorts);
});

如果你坚持要写入文件再读取

可以这样修改子进程的调用方式,让CMD处理重定向:

const { spawn } = require("child_process");
const fs = require("fs");

const outputPath = "D:/iplookup/out.txt";
// 调用CMD执行带重定向的命令
const netstat = spawn("cmd.exe", ["/c", `netstat -n > ${outputPath}`], { shell: true });

netstat.on("close", (code) => {
  if (code !== 0) {
    console.error(`netstat执行失败,退出码:${code}`);
    return;
  }

  fs.readFile(outputPath, "utf8", (error, data) => {
    if (error) { 
      console.error("读取文件失败:", error); 
      return;
    }

    const ipPortRegex = /((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):[0-9]{1,5}/g;
    const matches = [...data.matchAll(ipPortRegex)];
    const ipPorts = matches.map(m => m[0]);

    console.log("提取到的IP:Port列表:");
    console.log(ipPorts);
  });
});

关键总结

  • 处理Shell命令的重定向时,必须确保让Shell来解析语法(开启shell: true或调用cmd.exe);
  • 正则表达式要根据实际文本结构调整,避免错误的锚点和量词;
  • 正确处理matchAll返回的迭代器,用扩展运算符转为数组后提取结果。

内容的提问来源于stack exchange,提问作者Jacs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:27:41