0 votes

Le démon Mac n'est pas capable d'exécuter un script bash

Initialement demandé sur Stack Overflow, mais cela pourrait mieux convenir ici. Peu importe où il est répondu en premier, je veillerai à mettre à jour la question correspondante avec la même réponse.

J'ai déjà vérifié cette question similaire.

OS MacOS 10.15.17 (Catalina)

Je veux créer un script qui utilise iperf pour lancer un client qui mesure la vitesse de ma connexion toutes les quelques secondes pendant une période prolongée. J'ai créé un fichier daemon et l'ai placé dans ~/Library/LaunchAgents/com.myself.iperfclient.plist.

com.myself.iperfclient.plist

        Label
        com.myself.iperfclient

        ProgramArguments

            /Users/myself/Documents/bin/iperf/netspeed

        StartInterval
        20  

        Disabled

netspeed

#!/bin/bash

# voir https://stackoverflow.com/a/246128/10200417
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
nom_script=`basename $0`
# echo "script appelé $nom_script depuis $script_dir"

serveur_iperf=127.0.0.1
port_iperf=54321

# lancer le client iperf, enregistrer les résultats dans ./logs/client.log
iperf \
    -c $serveur_iperf \
    -p $port_iperf \
    --logfile $script_dir/logs/client.log

Le fichier netspeed est exécutable pour tout le monde :

$ ls -l netspeed
  -rwxr-xr-x@ 1 myself  staff  379 Jan 11 21:36 netspeed

Lorsque j'essaie d'ajouter le nouveau daemon, avec launchctl load ~/Library/LaunchAgents/com.myself.iperfclient.plist, voici le message d'erreur que je reçois dans la Console :

Sandbox: bash(50654) System Policy: deny(1) file-read-data /Users/myself/Documents/bin/iperf/netspeed

Si dans le descripteur .plist du daemon j'ajoute open comme premier élément dans ProgramArguments, il n'y a pas d'erreur. Cependant, je ne veux pas exécuter le script de cette manière car cela lance une nouvelle fenêtre Terminal à chaque fois, ce qui est extrêmement ennuyeux.

Ma question

Comment puis-je permettre à mon processus daemon d'exécuter netspeed ?

P.S.

Le code de statut de launchctl est 126.

$ launchctl list | grep myself
-   126 com.myself.iperfclient

1voto

owengall Points 11

D'accord, voilà ce que j'ai fini par faire, ce qui fonctionne et ne nécessite aucune autre installation. J'ai essayé la réponse de Gilby, mais je n'ai pas pu faire fonctionner fdautil après l'avoir téléchargé et installé via la version d'essai de LaunchControl.

Si cela avait fonctionné, il semble que cela aurait été fait en accordant un accès complet au disque à l'utilitaire fdautil de LaunchControl, qui utiliserait ensuite ces autorisations d'une manière ou d'une autre pour exécuter mon script netspeed (sans transmettre ces autorisations à /bin/bash ?).

Méthode 1 : Enveloppe AppleScript

J'ai créé Utilisateurs/moi/Documents/bin/iperf/netspeed.scpt, qui contient ce qui suit :

do shell script "/Utilisateurs/moi/Documents/bin/iperf/netspeed"

J'ai ensuite mis à jour l'entrée ProgramArguments dans le fichier launchd plist comme suit :

ProgramArguments

    /usr/bin/osascript
    /Utilisateurs/moi/Documents/bin/iperf/netspeed.scpt

Enfin, dans Préférences Système > Sécurité et confidentialité > Fichiers et dossiers, j'ai pu accorder l'accès pour Utilisateurs/moi/Documents à /usr/bin/osascript, et lancer avec succès le démon.

Méthode 2 : Placer le script dans un emplacement avec moins de sécurité

Comme l'a signalé @user3439894, étant donné que la principale raison pour laquelle il était difficile d'exécuter netspeed en premier lieu était que je l'avais dans ~moi/Documents.../, ce qui nécessite des autorisations élevées, je peux également le placer dans un emplacement avec moins de sécurité.

J'ai suivi la suggestion d'essayer /Utilisateurs/Partagé/.../netspeed et cela a effectivement fonctionné avec mon script et le contenu du plist d'origine ! Pour être clair, les ProgramArguments seraient maintenant :

ProgramArguments

    /Utilisateurs/Partagé/.../netspeed

0voto

user43889 Points 266

Le programme que vous souhaitez exécuter est bash, donc les arguments du programme devraient être :

    ProgramArguments

        /bin/bash
        /Users/myself/Documents/bin/iperf/netspeed

Mais je soupçonne que vous pourriez encore obtenir des erreurs de sandbox. Pour éviter cela, utilisez la commande fdautil qui fait partie de Launch Control. Ensuite, utilisez :

ProgramArguments

    /usr/local/bin/fdautil
    exec
    /bin/bash
    /Users/myself/Documents/bin/iperf/netspeed

C'est le mécanisme que j'ai utilisé pour lancer un script python (avec la différence évidente).

Cette réponse peut être incomplète, mais voyez comment vous vous en sortez.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X