基于 SSID 更改 MacOS 位置 - 更改前检查当前位置
Changing MacOS Location based on SSID - check current location before changing
在 I received some assistance with getting this script 中正常工作。该脚本基本上根据我连接的 SSID 设置我的网络位置。现在可以使用了,但是,它会生成很多令人讨厌的通知。
每次我的笔记本电脑加入 wifi 网络时,脚本都会运行,设置网络位置,并给我一个通知。由于 power nap 会定期加入 wifi 以检查 emails/updates 以及你有什么,在一个漫长的周末之后我会收到许多相同的通知。
如何修改脚本,使其仅在网络位置更改为其他内容时才发送通知,而不仅仅是在脚本运行时发送通知?如果 "new" 位置与 "existing" 位置不同,我能否以某种方式检查现有网络位置并仅更改 it/trigger 通知?
同样,一般来说,我对 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
This thread 说明如何获取当前网络位置。
我在进行任何更改之前添加了以下代码以获取当前网络位置:
CurrLoc=$(scselect | awk '{if (=="*") print }' | sed 's/[()]//g')
然后是一个简单的 if 语句,如果评估的 "new" 网络位置与现有位置匹配,则提前退出脚本:
if [ "$CurrLoc" = "$LOCATION" ]
then
exit 0
fi
# existing code to change network location and show notifications
在
每次我的笔记本电脑加入 wifi 网络时,脚本都会运行,设置网络位置,并给我一个通知。由于 power nap 会定期加入 wifi 以检查 emails/updates 以及你有什么,在一个漫长的周末之后我会收到许多相同的通知。
如何修改脚本,使其仅在网络位置更改为其他内容时才发送通知,而不仅仅是在脚本运行时发送通知?如果 "new" 位置与 "existing" 位置不同,我能否以某种方式检查现有网络位置并仅更改 it/trigger 通知?
同样,一般来说,我对 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
This thread 说明如何获取当前网络位置。
我在进行任何更改之前添加了以下代码以获取当前网络位置:
CurrLoc=$(scselect | awk '{if (=="*") print }' | sed 's/[()]//g')
然后是一个简单的 if 语句,如果评估的 "new" 网络位置与现有位置匹配,则提前退出脚本:
if [ "$CurrLoc" = "$LOCATION" ]
then
exit 0
fi
# existing code to change network location and show notifications