macOS:从网络设备名称获取设备名

先从ifconfig命令说起,这个命令后面可以跟上一个叫做interface的参数,就可以查看该interface所代表的网络设备的网络情况,比如:

ifconfig en0; ifconfig en1

一般来说,从这里很难看出这个en0和en1那个是无线网卡、那个是有线网。尤其是新版的laptop没有有线网卡,那么en0就是无线网卡。


为了动态获得WiFi对应的是哪个设备,我们需要使用networksetup命令的帮助。

networksetup命令有一个-listallhardwareports的命令,给出下面形式的系统网络配置信息:

$ networksetup -listallhardwareports

Hardware Port: Ethernet
Device: en0
Ethernet Address: 10:dd:b1:d0:78:98

Hardware Port: FireWire
Device: fw0
Ethernet Address: 44:fb:42:ff:fe:55:7f:ea

Hardware Port: Wi-Fi
Device: en1
Ethernet Address: 88:1f:a1:10:75:7e

Hardware Port: Bluetooth PAN
Device: en3
Ethernet Address: a8:bb:cf:0e:6e:71

Hardware Port: Thunderbolt 1
Device: en2
Ethernet Address: d2:00:15:57:fe:a0

Hardware Port: Thunderbolt 网桥
Device: bridge0
Ethernet Address: d2:00:15:57:fe:a0

VLAN Configurations
===================

如果运行networksetup -h,还可以看到最开始的命令行,比如:networksetup -listallnetworkservices。在往下看,networksetup命令行中有好多称呼,什么networksevice, device, device name, service name等等。看到这里,可以感受到macOS内部对于网络接口的混乱称呼,而且还有hardware ports, 在加上ifconfig中的interface,真不知道他们到底是什么鬼,干嘛搞出这多名词。

其实,只要记住,他们就是两类,一类是设备名,一类是服务名

  • 设备名有:interface, device, device name
  • 服务名有:hardware ports, networksevice, service name

我们的任务就是在服务名和设备名之间转化。本文所想描述的是从服务名获得相应的设备名,从而可以使用ifconfig之类的命令操作给设备。


1 最简单的命令行:

wifi=$(/usr/sbin/networksetup -listallhardwareports | /usr/bin/awk '/Wi-Fi|AirPort/ {getline; print $NF}')

上面一行可以说是,最简单的一行了,主要使用了awk命令。但是他有一个假设就是输出行的顺序必须是

Hardware Port: Wi-Fi
Device: en1
还有一点需要注意的,在老版本的mac OS X中,最早使用Airport代表Wi-Fi的,该命令更通用。


2 bash数组示范

下面我们使用bash的数组功能做一个函数获得任意服务名对应的设备名:

function findDevice()
{
	mDev="$1"
	IFS=$'\n'
	port=($(networksetup -listallhardwareports | grep "Hardware"))
	devices=($(networksetup -listallhardwareports | grep "Device"))
	# echo ${port[@]}, ${devices[@]}
	for (( count=0; count<${#port[@]}; count++ )); do
		[[ "${port[$count]}" = *"$mDev"* ]] && { echo ${devices[$count]} | awk -F ": " '{print $2}'; break; } || true
	done
	exit 0
}
虽说通过上一节的命令也可以定义一个函数,但是这个例子可以演示数组的用法,而且不会依赖于networksetup命令显示中各行的前后顺序

用法:

wifi=$(findDevice "Wi-Fi")
echo "Wi-Fi=($wifi)"

found=$(findDevice "Thunderbolt")
echo "Thunderbolt=($found)"

最后:

结合airport命令可以对WiFi进行详尽的配置:

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport /usr/sbin/airport $wifi prefs


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页