launchd.plistは、1回だけではなく、10秒ごとに実行されます



Launchd Plist Runs Every 10 Seconds Instead Just Once



解決:

外部デバイス(usb / thunderbolt)をMacコンピューターに接続することで、再生成の問題なしに任意の実行可能ファイルまたはシェルスクリプトをトリガーするための詳細な手順とサンプルファイルを使用して、これに関するチュートリアルを作成しました。

著者のアプローチのように、それはアップルのに依存していますデバイス検出用のIOKitライブラリと、目的の実行可能ファイルを実行するためのデーモン。デバイスの接続後にデーモンが繰り返しトリガーされないようにするために、特別なストリームハンドラー(xpc_set_event_stream_handler)は、「消費」するために使用されます@fordによる投稿と彼のgithubリポジトリで説明されているように、com.apple.iokit.matchingイベント。



特に、チュートリアルでは、xpcストリームハンドラーをコンパイルする方法と、デーモンplistファイル内の実行可能ファイルと一緒にそれを参照する方法、および関連するすべてのファイルを正しいアクセス許可で配置する場所について説明します。

ファイルについては、こちらをご覧ください。完全を期すために、私はそれらのコンテンツも以下に貼り付けました。



Macでデバイス検出によってトリガーされたシェルスクリプトまたは実行可能ファイルを実行する

ここでは、イーサネットアダプタがMacに接続されているときにそのMACアドレスをスプーフィングする例を使用します。これは、任意の実行可能ファイルとデバイスに一般化できます。

シェルスクリプトまたは実行可能ファイルを配置します

シェルスクリプトを適応させるspoof-mac.sh

#!/ bin / bash ifconfig en12 ether 12:34:56:78:9A:BC

必要に応じて実行可能にします。



sudo chmod 755 spoof-mac.sh

次にそれをに移動します/ usr / local / bin、またはその他のディレクトリ:

cp spoof-mac.sh / usr / local / bin /

ストリームハンドラーの構築

ストリームハンドラxpc_set_event_stream_handler.m

// 2017年10月23日にフォードパーソンズによって作成されました。 // Copyright©2017FordParsons。全著作権所有。 // #import #include int main(int argc、const char * argv []){@ autoreleasepool {dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); xpc_set_event_stream_handler( 'com.apple.iokit.matching'、NULL、^(xpc_object_t _Nonnull object){const char * event = xpc_dictionary_get_string(object、XPC_EVENT_KEY_NAME); NSLog(@ '%s'、event); dispatch_semaphore_signal(semaphore); ); dispatch_semaphore_wait(semaphore、DISPATCH_TIME_FOREVER); if(argc> = 2){execv(argv [1]、(char **)argv + 1); }}}

ユニバーサル(適応する必要はありません)であり、Macコマンドライン(xcodeがインストールされている)で構築できます:

gcc -framework Foundation -o xpc_set_event_stream_handler xpc_set_event_stream_handler.m

入れましょう/ usr / local / bin、デーモンのメイン実行可能ファイルと同様。

cp xpc_set_event_stream_handler / usr / local / bin /

デーモンをセットアップします

plistファイルcom.spoofmac.plistには、デバイス接続トリガーで実行可能ファイルを実行するデーモンのプロパティが含まれています。

UserName root StandardErrorPath /tmp/spoofmac.stderr StandardOutPath /tmp/spoofmac.stdout Label com.spoofmac.program ProgramArguments / usr / local / bin / xpc_set_event_stream_handler /usr/local/bin/spoofmac.sh LaunchEvents com.apple.iokit.matching com .apple.device-attach idVendor 32902 idProduct 5427 IOProviderClass IOPCIDevice IOMatchLaunchStream IOMatchStream

トリガーのベースにするデバイスを識別するための情報が含まれています。idVendor、idProduct、IOProviderClass。これらはで理解することができますMacのシステム情報アプリ。

スクリーンショットシステム情報

plistファイルに挿入する前に、16進識別子を整数に変換します(たとえば、Pythonではint(0x8086))。

IOProviderClassは次のいずれかである必要がありますIOPCIDevice(Thunderbolt)またはIOUSBDevice(USB)。

plistファイルの他の関連エントリは次の場所です。xpc_set_event_stream_handlerと実行可能ファイル。

その他のエントリには、標準出力(ログ)ファイルの場所と実行中のユーザーが含まれます。

MACスプーフィングにはroot権限が必要なため、com.spoofmac.plist into/ Library / LaunchDaemons:

cp com.spoofmac.plist / Library / LaunchDaemons /

にではないLaunchAgentsフォルダー。起動エージェントは無視しますUserName引数。

ファイルの所有者が根:

sudo chown root:wheel /Library/LaunchDaemons/com.spoofmac.plist

デーモンを起動します

デーモンをアクティブ化します。

launchctl load /Library/LaunchDaemons/com.spoofmac.plist

そして、あなたは行ってもいいです。

アンロードはを使用して行われますlaunchctlアンロード。


AIUIアプリケーションは、xpc_set_event_stream_handlerを呼び出して、キューからイベントを削除する必要があります。追加する必要があるかもしれませんKeepAliveを.plistに追加しますが、それについてはよくわかりません。