如何让 mac 自动设置 wifi 网络连接 mac 终端脚本设置网络状态
优质
小牛编辑
138浏览
2023-12-01
我的问题场景
我的mac在公司可以接入wifi(慢)和网线(快),在家只能接wifi,所以整体策略就是优先选有线网,没有接线就开无线网。因为mac同事有有线网和无线网的时候会优先选择无线网连接,所以需要一个自动关wifi的脚本来帮我做这件事。
我的脚本是这样的
#!/bin/bash
# 如果检测到有usb口以太网连上,就自动关掉wifi,如果没有连就自动打开wifi
while true
do
usbethcount=`networksetup -listallhardwareports|grep "Apple USB Ethernet Adapter"|wc -l`
wifioffcount=`/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | grep "AirPort: Off" | wc -l`
if [ $usbethcount -eq 1 ]; then
# 如果usb有网络连接
if [ $wifioffcount -ne 1 ]; then
# 如果wifi开着呢
networksetup -setairportpower en0 off
date; echo "turn wifi off"
fi
else
# 如果usb无网络连接
if [ $wifioffcount -eq 1 ]; then
# 如果wifi关着呢
networksetup -setairportpower en0 on
date; echo "turn wifi on"
fi
fi
sleep 2
done >> /var/log/auto_usb_net.sh.log
exit 0
这里面比较重要的是两个命令,来获取当前的网络信息
networksetup -listallhardwareports
的执行结果如下:
Hardware Port: Apple USB Ethernet Adapter
Device: en4
Ethernet Address: 00:10:00:00:13:8d
Hardware Port: Wi-Fi
Device: en0
Ethernet Address: a0:99:9b:0d:67:87
Hardware Port: Bluetooth PAN
Device: en3
Ethernet Address: a0:99:9b:0d:67:88
可以看到我通过usb口接了有线网,同事有无线网接口(我这时候是关闭着无线网的),这条命令能看出有关网络的硬件有哪些,但是判断不了状态
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
的执行结果有如下两种:
关闭了wifi时
AirPort: Off
打开了wifi时
agrCtlRSSI: -60
agrExtRSSI: 0
agrCtlNoise: -92
agrExtNoise: 0
state: running
op mode: station
lastTxRate: 878
maxRate: 1300
lastAssocStatus: 0
802.11 auth: open
link auth: wpa2
BSSID: 64:f6:9d?e8:8f
SSID: BJHL
MCS: 7
channel: 161,80
那么我就是通过
networksetup -listallhardwareports
来判断网线有没有插入usb,并通过airport -I来判断wifi有没有打开,每隔2秒钟检测一次,时间间隔有点短,但是因为没有变动情况不会真正开关wifi,所以不占用极少资源
那么怎么才能开关wifi呢?
打开wifi
networksetup -setairportpower en0 on
关闭wifi
networksetup -setairportpower en0 off
OK,大功告成,再添加一些打印日志信息到/var/log/auto_usb_net.sh.log,就可以查看变化的日志啦!
那么这个脚本怎么才能启动呢?
手工执行的话直接nohup auto_usb_net.sh &压后台执行就行了
如果想开机自动启动可以百度一下开机自动启动的方法