launchd.plist beží každých 10 sekúnd, nie iba raz
Launchd Plist Runs Every 10 Seconds Instead Just Once
Riešenie:
Napísal som o tom návod s podrobnými pokynmi a ukážkovými súbormi na spustenie ľubovoľného spustiteľného alebo shell skriptu pripojením externého zariadenia (usb/thunderbolt) k počítaču Mac bez problému s respawningom.
Ako autori pristupujú, spolieha sa na AppleKnižnica IOKit na detekciu zariadenia a démon na spustenie požadovaného spustiteľného súboru. Aby sa démon nespustil opakovane po pripojení zariadenia, špeciálny obslužný program streamu (
xpc_set_event_stream_handler) sa používa na 'konzumáciu' súboru
com.apple.iokit.matching udalosť, ako je vysvetlené v príspevku @ford a v jeho repo github.
Tento tutoriál konkrétne popisuje, ako zostaviť obslužný program toku xpc a ako naň odkazovať spolu so spustiteľným súborom démona plist a kam umiestniť všetky relevantné súbory so správnymi povoleniami.
Súbory nájdete tu. Pre úplnosť, nižšie som prilepil aj ich obsah.
Spustite skript shellu alebo spustiteľný súbor spustený detekciou zariadenia na počítači Mac
Tu používam príklad falšovania adresy MAC ethernetového adaptéra, keď je pripojený k počítaču Mac. Toto je možné zovšeobecniť na ľubovoľné spustiteľné súbory a zariadenia.
Vložte skript alebo spustiteľný súbor shell na miesto
Prispôsobte skript shelluspoof-mac.sh
#!/bin/bash ifconfig en12 éter 12: 34: 56: 78: 9A: BCvašim potrebám a spustite ho:
sudo chmod 755 spoof-mac.shPotom ho presuňte do/usr/local/bin alebo iný adresár:
cp spoof-mac.sh/usr/local/bin/Budovanie obsluhy toku
Obsluha streamuxpc_set_event_stream_handler.m
// Vytvoril Ford Parsons 23.10.17. // Copyright © 2017 Ford Parsons. Všetky práva vyhradené. // #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 (objekt, XPC_EVENT_KEY_NAME); NSLog (@'%s', eventaph); dispatch ); dispatch_semaphore_wait (semafor, DISPATCH_TIME_FOREVER); if (argc> = 2) {execv (argv [1], (char **) argv+1); }}}je univerzálny (nie je potrebné ho upravovať) a je možné ho vytvoriť na príkazovom riadku mac (s nainštalovaným xcode):
gcc -framework Foundation -o xpc_set_event_stream_handler xpc_set_event_stream_handler.mPoložme to do/usr/local/bin, ako hlavný spustiteľný súbor pre démona.
cp xpc_set_event_stream_handler/usr/local/bin/Nastavte démona
Súbor plistcom.spoofmac.plist obsahuje vlastnosti démona, ktorý spustí spustiteľný súbor na spúšťači pripojenia zariadenia.
Používateľské meno 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 LaunchEios.com .apple.device-attach idVendor 32902 idProduct 5427 IOProviderClass IOPCIDevice IOMatchLaunchStream IOMatchStreamObsahuje informácie na identifikáciu zariadenia, na ktorom chcete spustiť, napríkladidVendor,idProduct,IOProviderClass. Dajú sa zistiť vAplikácia Informácie o systéme na vašom počítači Mac.

Pred vložením do súboru plist konvertujte hexadecimálne identifikátory na celé čísla (napríklad pomocouint (0x8086) v pythone).
IOProviderClass by mal byť buďIOPCIDevice (Thunderbolt) aleboZariadenie IOUSB (USB).
Ďalšou relevantnou položkou v súbore plist je umiestneniexpc_set_event_stream_handler a spustiteľný súbor.
Medzi ďalšie položky patrí umiestnenie štandardných výstupných (protokolových) súborov a vykonávajúceho používateľa.
Pretože falšovanie MAC vyžaduje oprávnenia root, uviedli smecom.spoofmac.plist do/Knižnica/SpustenieDémoni:
cp com.spoofmac.plist/Knižnica/LaunchDaons/nie do aPriečinok LaunchAgents. Spúšťací agenti ignorujúArgument UserName.
Uistite sa, že vlastník súboru jekoreň:
sudo chown root: wheel /Library/LaunchDaemons/com.spoofmac.plistSpustite démona
Aktivujte démona:
launchctl load /Library/LaunchDaemons/com.spoofmac.plista môžeš ísť.
Vykladanie sa vykonáva pomocoulaunchctl vyložiť.
AIUI, vaša aplikácia musí zavolať xpc_set_event_stream_handler, aby odstránila udalosť z frontu. Možno budete musieť tiež pridaťKeepAlive to .plist, ale nie som si tým istý.