当前位置: 首页 > 文档资料 > 优质文章推荐 v1 >

如何让 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 &压后台执行就行了

如果想开机自动启动可以百度一下开机自动启动的方法