launchd.plist s'exécute toutes les 10 secondes au lieu d'une seule

Launchd Plist Runs Every 10 Seconds Instead Just Once



Solution:

J'ai écrit un tutoriel à ce sujet avec des instructions détaillées et des exemples de fichiers pour déclencher un script exécutable ou shell arbitraire par la connexion d'un périphérique externe (usb/thunderbolt) à un ordinateur Mac, sans problème de réapparition.

Comme l'approche des auteurs, il s'appuie sur lesBibliothèque IOKit pour la détection de périphériques et un démon pour exécuter l'exécutable souhaité. Pour que le démon ne soit pas déclenché à plusieurs reprises après la connexion de l'appareil, un gestionnaire de flux spécial (xpc_set_event_stream_handler) est utilisé pour « consommer » leévénement com.apple.iokit.matching, comme expliqué dans le post de @ford et dans son repo github.



En particulier, le didacticiel décrit comment compiler le gestionnaire de flux xpc et comment le référencer avec l'exécutable dans le fichier plist du démon et où placer tous les fichiers pertinents avec les autorisations appropriées.



Pour les fichiers, c'est ici. Pour être complet, j'ai également collé leur contenu ci-dessous.



Exécuter un script shell ou un exécutable déclenché par la détection de périphérique sur un mac

Ici, j'utilise l'exemple de l'usurpation de l'adresse MAC d'un adaptateur Ethernet lorsqu'il est connecté au Mac. Cela peut être généralisé à des exécutables et des périphériques arbitraires.

Mettez votre script shell ou exécutable en place

Adapter le script shellspoof-mac.sh

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

à vos besoins et le rendre exécutable :



sudo chmod 755 spoof-mac.sh

Puis déplacez-le dans/usr/local/bin, ou un autre répertoire :

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

Construire le gestionnaire de flux

Le gestionnaire de fluxxpc_set_event_stream_handler.m

// Créé par Ford Parsons le 23/10/17. // Copyright © 2017 Ford Parsons. Tous les droits sont réservés. // #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); ); dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); if(argc >= 2) { execv(argv[1], (char **)argv+1); } } }

est universel (pas besoin d'adaptation) et peut être construit sur une ligne de commande mac (avec xcode installé):

gcc -framework Foundation -o xpc_set_event_stream_handler xpc_set_event_stream_handler.m

Plaçons-le dans/usr/local/bin, comme l'exécutable principal du démon.

cp xpc_set_event_stream_handler /usr/local/bin/

Configurer le démon

Le fichier plistcom.spoofmac.plist contient les propriétés du démon qui exécutera l'exécutable sur le déclencheur de connexion au périphérique.

Nom d'utilisateur racine StandardErrorPath /tmp/spoofmac.stderr StandardOutPath /tmp/spoofmac.stdout Étiquette com.spoofmac.program ProgramArguments /usr/local/bin/xpc_set_event_stream_handler /usr/local/bin/spoofmac.sh LaunchEvents.matchingapple.comio .apple.device-attach idVendor 32902 idProduct 5427 IOProviderClass IOPCIDevice IOMatchLaunchStream IOMatchStream

Il contient des informations permettant d'identifier l'appareil sur lequel vous souhaitez baser votre déclencheur, commeID Vendeur,idProduit,IOProviderClass. Ceux-ci peuvent être compris dans leApplication d'informations système sur votre mac.

Capture d

Convertissez les identifiants hexadécimaux en nombres entiers avant de les insérer dans le fichier plist (par exemple en utilisantint (0x8086) en python).

IOProviderClass doit être soitIOPCIDevice (Thunderbolt) ouPériphérique IOUSB (USB).

L'autre entrée pertinente dans le fichier plist est l'emplacement dexpc_set_event_stream_handler et l'exécutable.

Les autres entrées incluent l'emplacement des fichiers de sortie standard (journaux) et l'utilisateur exécutant.

Étant donné que l'usurpation MAC nécessite des privilèges root, nous mettonscom.spoofmac.plist dans/Bibliothèque/LaunchDaemons :

cp com.spoofmac.plist /Bibliothèque/LaunchDaemons/

pas dans undossier LaunchAgents. Les agents de lancement ignorent leArgument Nom d'utilisateur.

Assurez-vous que le propriétaire du fichier estracine:

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

Lancer le démon

Activez le démon :

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

et vous êtes prêt à partir.

Le déchargement se fait à l'aidelaunchctl décharger.


AIUI votre application doit appeler xpc_set_event_stream_handler pour supprimer l'événement de la file d'attente. Vous devrez peut-être aussi ajouterKeepAlive au .plist, mais je n'en suis pas sûr.