如何以编程方式获取所有活动网络接口的列表?


9

我的目标是确定设备上以太网的IP地址。但假设有像WiFi和USB以太网这样的连接,是否有一种特殊的方式来获得以太网IP?

在shell上我会做:networksetup -listallhardwareports

这将给我一个硬件端口到设备的映射。从那里我会grep设备的硬件端口:以太网,然后使用ifaddr结构来获取我的IP。

我知道ifaddr部分,请建议如何以编程方式完成第一部分。还有,还有另一种方法吗?

Answers:


8

可能有几种不同的方法来完成你所要求的,但是,我会把它扔出去。

我有一台没有内置以太网端口的MacBook Pro,所以在我的例子中我将使用硬件端口:Wi-Fi,因为我在下面的两个例子中测试了它并且它工作正常,但你可以将它改为硬件端口:以太网,如果这是
networksetup -listallhardwareports显示的输出。

如果您只想输出目标设备的IP地址stdout,请使用以下示例:

$ ipconfig getifaddr $(networksetup -listallhardwareports | awk '/Hardware Port: Wi-Fi/{getline; print $2}')
$ 192.168.1.100

如果你想将其分配给一个变量脚本中,可以使用下面的例子:

ipAddress="$(ipconfig getifaddr $(networksetup -listallhardwareports | awk '/Hardware Port: Wi-Fi/{getline; print $2}'))"


说明:

networksetup -listallhardwareports我系统的相关输出是:

Hardware Port: Wi-Fi
Device: en0
Ethernet Address: 28:cf:e3:10:a4:cd

(注意:那不是我的真实MAC地址)

使用$(...)命令替换以便传递给ipconfig getifaddr <args>我的东西我确定硬件端口的设备名称与输出networksetup -listallhardwareports和管道|通过awk它寻找Hardware Port: Wi-Fi并使用该get line函数,该函数读取匹配后的下一行并传递给print $2,在本质打印匹配后的行的第二部分,在这种情况下,en0ipconfig getifaddr在第一个示例中作为其参数传递给它,例如ipconfig getifaddr en0。其输出是IP地址。

在第二个示例中,在示例$(...)中使用的复杂命令行周围使用第二个命令替换stdout,以便在脚本中使用时将其分配给ipAddress 变量

注意:这实际上是一个例子,因为我没有编写它来解释设备关闭。换句话说,如果该设备没有和IP地址不会有任何输出stdout,并没有分配给ipAddress 变量脚本。尽管在脚本中它可以被编码以测试ipAddress 变量是否为空并且相应地起作用。


2
哦,谢谢,但我正在寻找一个更基于系统调用/ C的解决方案....
user447851 2016年

0

使用SCNetworkInterfaceCopyAll获取接口列表,然后过滤掉那些不 通过SCNetworkInterfaceGetInterfaceType返回以太网接口。从那里你可以获得网关和掩码等 - 在python中我使用netifaces


2
它是AskDifferent的最佳实践,不仅提供链接,还提供您引用的页面中的重要片段。经常链接死亡,没有上下文,你的答案就变得毫无价值。只要正确归因,就可以随意复制和粘贴必要的代码行和背景信息。
IconDaemon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.