시작 : 위치를 입력 할 때 스크립트 시작


2

질문 : 특정 위치를 입력 할 때 스크립트를 시작하고 유지하도록 LaunchAgent를 구성하는 방법이 있습니까?

예 : "Office"위치로 전환 할 때 필요한 SSH 터널을 여는 스크립트를 시작하는 LaunchAgent를 트리거하려고합니다.


1
$ 19를 기꺼이 지불하려는 경우 Locations : "네트워크가 변경 될 때 위치를보고 설정을 전환합니다." codehackers.net/locations . 작업 목록 중 "터미널 명령 실행"이 있습니다. 나는 이것이 "쉘 스크립트를 실행한다"라고 말하는 괴짜가 아니라고 생각합니다
Doug Harris

naaah, 나는 가난한 IT 학생이고 이것을 혼자서 해킹하고 싶습니다 .. =)
lajuette

답변:


2

맥 OS X가있는 파일을 업데이트 /Library/Preferences/SystemConfiguration/라고합니다 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 ​​=> 부재 중"행을 확인하십시오.

체크 아웃 할 수 있습니다 : 확실하지 않은 경우 launchd를 사용하여 스크립트를로드하고 실행하는 방법에 대한 자세한 내용을 보려면 Mac OS X에서 매일 스크립트를 실행하려면 어떻게해야합니까 ?


좋은 소리, 내일 사용해 볼게요!
lajuette

폴링을 제외하고 (내가 게시 한 것을 이해하면 30 초마다 변경 사항에 대한 설문 조사가 시작 되었습니까?)이 솔루션은 거의 완벽합니다. 그러나 폴링은 나에게 아무런 도움이되지 않습니다. 이벤트를 더 잘 잡는 버전을 원합니다. 그러나 당신을 위해 +10!
lajuette

@lajuette : 내가 아는 한 launchd는 폴링 할 필요가 없습니다-FSEvents API에서 메시지를 수신합니다-ThrottleInterval이 안전 조치로 사용되어 여기에 추가되어 이상 발생하지 않도록합니다. 30 초에 한 번 (이상한 경우) 필요에 따라이를 변경하거나 제거 할 수도 있습니다.
Chealion

ThrottleInterval을 제거하면이 값이 기본값으로 설정됩니다. 10 FSEvents API가 사용되었음을 증명할 수 있으면 +15 =)를 얻게됩니다.
lajuette

1
10 초마다 두 번 이상 실행해야하는 경우 ThrottleInterval을 0으로 설정할 수 있습니다. 사용되는 API에 대해서는 launchd.macosforge.org 에서 소스 외부에 대한 문서가 없습니다 . 기본적으로 kqueue를 사용하는 경우 kqueue는 드라이브에서 지원되지 않습니다 다음 은 폴링합니다. (큐는 HFS 드라이브에서 지원됩니다)
Chealion
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.