我的目标是确定设备上以太网的IP地址。但假设有像WiFi和USB以太网这样的连接,是否有一种特殊的方式来获得以太网IP?
在shell上我会做:networksetup -listallhardwareports
这将给我一个硬件端口到设备的映射。从那里我会grep设备的硬件端口:以太网,然后使用ifaddr结构来获取我的IP。
我知道ifaddr部分,请建议如何以编程方式完成第一部分。还有,还有另一种方法吗?
我的目标是确定设备上以太网的IP地址。但假设有像WiFi和USB以太网这样的连接,是否有一种特殊的方式来获得以太网IP?
在shell上我会做:networksetup -listallhardwareports
这将给我一个硬件端口到设备的映射。从那里我会grep设备的硬件端口:以太网,然后使用ifaddr结构来获取我的IP。
我知道ifaddr部分,请建议如何以编程方式完成第一部分。还有,还有另一种方法吗?
Answers:
可能有几种不同的方法来完成你所要求的,但是,我会把它扔出去。
我有一台没有内置以太网端口的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
,在本质打印匹配后的行的第二部分,在这种情况下,en0
并ipconfig getifaddr
在第一个示例中作为其参数传递给它,例如ipconfig getifaddr en0
。其输出是IP地址。
在第二个示例中,在示例$(...)
中使用的复杂命令行周围使用第二个命令替换stdout
,以便在脚本中使用时将其分配给ipAddress
变量。
注意:这实际上是一个例子,因为我没有编写它来解释设备关闭。换句话说,如果该设备没有和IP地址不会有任何输出stdout
,并没有分配给ipAddress
变量的脚本。尽管在脚本中它可以被编码以测试ipAddress
变量是否为空并且相应地起作用。
使用SCNetworkInterfaceCopyAll获取接口列表,然后过滤掉那些不 通过SCNetworkInterfaceGetInterfaceType返回以太网的接口。从那里你可以获得网关和掩码等 - 在python中我使用netifaces。