如何在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
相关产品推荐
相关产品推荐

