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

如何在Windows和Linux系统下用Node.js读取和设置DNS服务器?

在Node.js中跨平台读取/设置系统DNS服务器

读取DNS服务器(含网卡关联)

Node.js内置的dns.getServers()仅能返回当前系统使用的DNS服务器列表,无法关联到具体网卡,尤其是Windows系统。要获取网卡与DNS的对应关系,必须通过调用系统命令结合child_process模块实现:

Windows系统

使用netsh interface ip show dnsservers命令获取各网卡的DNS配置,解析输出即可得到对应关系:

const { exec } = require('child_process');

exec('netsh interface ip show dnsservers', (err, stdout) => {
  if (err) {
    console.error('执行命令失败:', err);
    return;
  }
  
  const lines = stdout.split('\n');
  let currentInterface = '';
  lines.forEach(line => {
    // 匹配网卡名称行
    if (line.trim().startsWith('接口')) {
      currentInterface = line.split(':')[1].trim();
    }
    // 匹配DNS服务器行
    else if (line.trim().startsWith('DNS 服务器')) {
      const dns = line.split(':')[1].trim();
      if (dns !== '无') {
        console.log(`网卡 ${currentInterface}: ${dns}`);
      }
    }
  });
});

Linux系统

根据系统网络管理工具选择命令:

  • 基于systemd的系统(如Ubuntu 18.04+)用resolvectl status:
const { exec } = require('child_process');

exec('resolvectl status', (err, stdout) => {
  if (err) {
    console.error('执行命令失败:', err);
    return;
  }
  
  const sections = stdout.split('\n\n');
  sections.forEach(section => {
    const lines = section.split('\n');
    const interfaceLine = lines.find(line => line.startsWith('Link '));
    if (!interfaceLine) return;
    
    const iface = interfaceLine.split(' ')[1];
    const dnsLine = lines.find(line => line.includes('DNS Servers:'));
    if (dnsLine) {
      const dns = dnsLine.split(':')[1].trim();
      console.log(`网卡 ${iface}: ${dns}`);
    }
  });
});
  • 使用NetworkManager的系统可替换为nmcli dev show命令,解析逻辑类似。

设置DNS服务器

Node.js没有内置跨平台设置DNS的API,必须通过调用系统命令实现,且需要对应权限(Windows需管理员,Linux需sudo):

Windows系统

使用netsh interface ip set dnsservers命令设置指定网卡的DNS:

const { exec } = require('child_process');

// 参数:网卡名称,DNS服务器地址
const setWindowsDNS = (interfaceName, dnsServer) => {
  exec(`netsh interface ip set dnsservers "${interfaceName}" static ${dnsServer}`, (err) => {
    if (err) {
      console.error('DNS设置失败:', err);
      return;
    }
    console.log('DNS设置成功');
  });
};

// 调用示例:为"以太网"网卡设置DNS为8.8.8.8
setWindowsDNS('以太网', '8.8.8.8');

Linux系统

根据网络管理工具选择命令:

  • 基于systemd的系统用resolvectl:
const { exec } = require('child_process');

// 参数:网卡名称,DNS服务器地址
const setLinuxDNS = (interfaceName, dnsServer) => {
  exec(`sudo resolvectl dns ${interfaceName} ${dnsServer}`, (err) => {
    if (err) {
      console.error('DNS设置失败:', err);
      return;
    }
    console.log('DNS设置成功');
  });
};

// 调用示例:为eth0网卡设置DNS为8.8.8.8
setLinuxDNS('eth0', '8.8.8.8');
  • 使用NetworkManager的系统可替换为nmcli con mod <连接名> ipv4.dns "<DNS地址>" && nmcli con up <连接名>命令。

跨平台适配建议

通过process.platform判断当前系统,自动切换对应逻辑:

const { exec } = require('child_process');

const getDNSWithInterface = () => {
  if (process.platform === 'win32') {
    // 执行Windows读取逻辑
  } else if (process.platform === 'linux') {
    // 执行Linux读取逻辑
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:41:02