在Node.js中,查找默认网关IP的最佳方法是什么?

4

现在在Node.js中查找默认网关IP地址的最佳方法是什么?

os.networkInterfaces()不能提供此信息。

唯一想到的方法是解析子进程route -nstdout

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.2     0.0.0.0         UG    100    0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

可能重复:https://dev59.com/DmAf5IYBdhLWcg3wsUbT - Asif Saeed
@AsifSaeed 这完全不相关。我们并不是在谈论服务器。情境完全不同。 - Rocco Musolino
3个回答

3

1
值得一提的是,这个包基本上就是做了 OP 所要求的事情。例如,在 Linux 系统上获取默认网关时,它会分析 ip route 的输出:https://github.com/tomas/network/blob/master/lib/linux.js#L42 - jacobq
1
而且它做得非常差!实现使用:trim_exec("ip r | grep " + nic_name + " | grep default | cut -d ' ' -f 3 | head -n1", cb);。解析在一个使用大量 shell 工具的 shell 中完成。更不用说将任何字符串输入到命令中可能存在的安全风险了。不支持IPv6(ip -6 route)。在Linux上,您不需要解析 ip 命令,可以直接解析 /proc/net/route,这样完全不需要生成任何子进程。 - Yeti

0

由于所有其他方法都不起作用,而且JavaScript非常有限。这是我的代码片段..我并不真正擅长javas-但逻辑是,如果一个IP在特定时间内响应,则它是网关IP。否则就不是。网关IP在列表中越多,就越好,但是仍然存在使用该脚本的缺点。由于大多数网关IP实际上被其他网络上的设备占用,这可能会引起问题,结果可能不准确。

var responses = [];
var ips = ["192.168.1.1", "192.168.0.1", "10.0.0.138", "192.168.2.1", "192.168.254.254", "10.0.1.1", "192.168.3.1", "10.10.1.1", "10.0.0.1", "10.0.0.2", "10.1.1.1", "192.168.11.1", "192.168.0.30", "192.168.0.50", "192.168.0.10", "192.168.0.101", "192.168.15.1", "10.90.90.90", "192.168.8.1", "192.168.86.1", "192.168.100.1", "192.168.123.254", "192.168.16.1", "192.168.10.1", "192.168.20.1", "192.168.30.1", "192.168.62.1", "192.168.102.1", "192.168.0.227", "192.168.10.50", "10.1.10.1", "192.168.0.3", "192.168.168.168", "192.168.50.1", "192.168.55.1", "192.168.251.1", "192.168.0.254", "192.168.0.100", "192.168.10.10", "192.168.10.100", "192.168.223.100", "200.200.200.5", "192.168.4.1", "192.168.100.100", "192.168.2.254"];
var length = ips.length

for (var i = 0; i < length; i++){
    (async function(){
        var connection = new WebSocket('ws://' + ips[i] + ':80');
        await new Promise (function(res){
                var timeout = setTimeout(function() {
                                console.log("Socket connection timeout", connection.readyState);
                                console.log(connection.url);
                                if (connection.readyState == 3){
                                    responses.push('valid')
                                    alert(connection.url);
                                } else {
                                    responses.push('invalid')
                                }
                                connection.close();
                }, 5000);
                res();
        });
    })();

}

“这可能会导致问题,结果可能不准确。”是一个公正的陈述。仅在没有其他方法可用时,才应使用此类“黑客”间接地推断系统状态。该答案似乎假定“网关”是侦听端口80的HTTP服务器,具有常见的IP地址,也许还假定代码正在浏览器中运行,而不是像OP所述的Node.js。考虑改用default-gateway - jacobq

-1

在Ubuntu中我是这样尝试的

const spawn = require('child_process').spawnSync;

const child = spawn('bash', ['-c', 'ip r']).stdout.toString();
const gateway = child.match(/default via (.*?)\s/)[1];
console.log(gateway);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接