launchd:进入位置时启动脚本

launchd:进入位置时启动脚本

问题:有没有办法配置 LaunchAgent 在进入特定位置时启动(并保持)脚本?

例子:当切换到位置“办公室”时,我想要触发一个 LaunchAgent,启动一个脚本,打开我需要的 SSH 隧道。

答案1

/Library/Preferences/SystemConfiguration/Mac OS X 更新名为的文件preferences.plist。它将名为 的键更新CurrentSet为当前位置的 UUID(每个位置在创建时都会被赋予一个 UUID。)您可以通过UserDefinedName在字典中查找与 UUID 同名的键来确定该位置的名称。

示例脚本:

#! /bin/bash

# Proof of Concept Script to check if the location changed.

CURRENT_LOCATION=`/usr/libexec/PlistBuddy -c "Print :CurrentSet" /Library/Preferences/SystemConfiguration/preferences.plist | sed 's/\/Sets\///'`
CURRENT_LOCATION_NAME=`/usr/libexec/PlistBuddy -c "Print :Sets:$CURRENT_LOCATION:UserDefinedName" /Library/Preferences/SystemConfiguration/preferences.plist`

# If location is the one we want:
# Logger puts the message into syslog

if [ $CURRENT_LOCATION_NAME == "Office" ]; then
    logger "`date` => In the Office"

    #Commands to set up SSH Tunnel among others

else
# If the location is not the one we want: Undo whatever we have done.
    logger "`date` => Out of Office"

    #Commands here for when you leave the office location
fi

每当位置改变时,运行上述脚本的示例 LaunchAgent:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>local.IDENTIFIER_HERE.SOMETHING</string>
    <key>OnDemand</key>
    <true/>
    <key>Program</key>
    <string>/PATH/TO/SCRIPT</string>
    <key>WatchPaths</key>
    <array>
        <string>/Library/Preferences/SystemConfiguration/preferences.plist</string>
    </array>
</dict>
</plist>

填写脚本的路径,为其指定一个标识符,并使用相同的名称保存它(例如,local.lajuette.location应该是名为 的文件local.lajuette.location.plist)。将此文件复制到~/Library/LaunchAgents并运行launchctl load ~/Library/LaunchAgents/name.of.plist.here.plist。使用示例文件打开 Console.app 并相应地检查行:“DATE => 在办公室”或“DATE => 不在办公室”。

你可能想看看:我如何让脚本在 Mac OS X 上每天运行如果您不确定,请参阅如何使用 launchd 加载和运行脚本的更多信息。

相关内容