首页 > 解决方案 > 根据 SSID 更改 MacOS 位置 - 在更改之前检查当前位置

问题描述

这个线程中,我得到了一些帮助,让这个脚本正常工作。该脚本本质上是根据我连接的 SSID 设置我的网络位置。这现在正在工作,但是,它会产生很多令人讨厌的通知。

每次我的笔记本电脑加入 wifi 网络时,脚本都会运行,设置网络位置,并给我一个通知。由于小睡会定期加入 wifi 以检查电子邮件/更新以及你有什么,在一个漫长的周末之后,我会收到几十个相同的通知。

如何修改脚本,使其仅在网络位置更改为不同时发送通知,而不仅仅是在脚本运行时发送通知?我可以以某种方式检查现有的网络位置,并且仅在“新”位置与“现有”位置不同时才更改它/触发通知?

再说一次,我对在 mac 和 GitHub 上编写脚本非常陌生。我以前的经验都是在 Windows 上的,主要是自学的。

脚本:

#!/bin/bash

# automatically change configuration of Mac OS X based on location

# redirect all IO to a logfile
mkdir -p /usr/local/var/log
exec &>/usr/local/var/log/locationchanger.log

# get a little breather before we get data for things to settle down
sleep 2


# get SSID
SSID=$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | sed -n 's/^ *SSID: //p')
echo $(date) "New SSID found: $SSID"

# LOCATIONS
LOCATION=
Location_Automatic="Automatic"
Location_Office="Office"
Location_Site="Site"

# SSIDS
SSID_Office="My Office SSID"
SSID_Site="My Mobile SSID"


# SSID -> LOCATION mapping
case $SSID in
    "$SSID_Office") LOCATION="$Location_Office";;
    "$SSID_Site"  ) LOCATION="$Location_Site";;

esac
    REASON="SSID changed to $SSID"


# Location_Automatic
if [ -z "$LOCATION" ]; then
    LOCATION="$Location_Automatic"
    REASON="Automatic Fallback"
fi

# change network location
scselect "$LOCATION"

case $LOCATION in
    "$Location_Automatic" )
        osascript -e 'display notification "Network Location Changed to Automatic" with title "Network Location Changed"'
    ;;

    "$Location_Office" )
        osascript -e 'display notification "Network Location Changed to Office" with title "Network Location Changed"'
    ;;

    "$Location_Site" )
        osascript -e 'display notification "Network Location Changed to Site" with title "Network Location Changed"'
    ;;

esac

echo "--> Location Changer: $LOCATION - $REASON"

exit 0

标签: bashmacosnotifications

解决方案


该线程解释了如何获取当前网络位置。

在进行任何更改之前,我添加了以下代码以获取当前网络位置:

CurrLoc=$(scselect | awk '{if ($1=="*") print $3}' | sed 's/[()]//g')

如果评估的“新”网络位置与现有网络位置匹配,则使用一个简单的 if 语句提前退出脚本:

if [ "$CurrLoc" = "$LOCATION" ]
then
    exit 0
fi

# existing code to change network location and show notifications

推荐阅读