0 votos

Mac daemon no puede ejecutar bash script

Originalmente preguntado en Stack Overflow pero puede ser más adecuado para aquí. Dondequiera que se responda primero, me aseguraré de actualizar la pregunta homóloga con la misma respuesta.

Ya he comprobado esta pregunta similar .

OS MacOS 10.15.17 (Catalina)

Quiero crear un script que utilice iperf para lanzar un cliente que mida mi velocidad de conexión cada varios segundos durante un periodo prolongado. He creado un archivo daemon y lo he puesto en ~/Library/LaunchAgents/com.myself.iperfclient.plist .

com.myself.iperfclient.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.myself.iperfclient</string>

        <key>ProgramArguments</key>
        <array>
            <string>/Users/myself/Documents/bin/iperf/netspeed</string>
        </array>

        <key>StartInterval</key>
        <integer>20</integer>  <!-- in seconds -->

        <key>Disabled</key>
        <false/>
    </dict>
</plist>

netspeed

#!/bin/bash

# see https://stackoverflow.com/a/246128/10200417
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
script_name=`basename $0`
# echo "called script $script_name from $script_dir"

iperf_server=127.0.0.1
iperf_port=54321

# launch iperf client, log results to ./logs/client.log
iperf \
    -c $iperf_server \
    -p $iperf_port \
    --logfile $script_dir/logs/client.log

El netspeed es ejecutable por cualquiera:

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

Cuando intento añadir el nuevo demonio, con launchctl load ~/Library/LaunchAgents/com.myself.iperfclient.plist Este es el mensaje de error que aparece en la consola:

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

Si en el .plist descriptor para el demonio añado <string>open</string> como primer elemento de ProgramArguments No hay ningún error. Sin embargo, no quiero ejecutar el script de esta manera porque lanza una nueva ventana de Terminal cada vez, lo cual es extremadamente molesto.

Mi pregunta

¿Cómo puedo permitir que mi proceso daemon se ejecute netspeed ?

P.D.

El código de estado de launchctl es 126 .

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

1voto

owengall Puntos 1

Muy bien, esto es lo que terminé haciendo, que sí funciona y no requiere ninguna otra instalación. He probado la respuesta de Gilby , pero no fue capaz de conseguir fdautil para que funcione después de descargarlo e instalarlo a través de la versión de prueba de LaunchControl.

Si hubiera funcionado, parece que lo habría hecho concediendo a LaunchControl fdautil acceso total al disco, que luego utilizaría esos permisos de alguna manera para ejecutar mi netspeed script (sin pasar esos permisos a /bin/bash ?).

Método 1: Envoltura AppleScript

He creado Users/myself/Documents/bin/iperf/netspeed.scpt que tiene lo siguiente:

do shell script "/Users/myself/Documents/bin/iperf/netspeed"

A continuación, actualicé el ProgramaArgumentos en el plist de launchd:

<key>ProgramArguments</key>
<array>
    <string>/usr/bin/osascript</string>
    <string>/Users/myself/Documents/bin/iperf/netspeed.scpt</string>
</array>

Por último, en System Preferences > Security and Privacy > Files and Folders Pude conceder el acceso para Users/myself/Documents a /usr/bin/osascript y lanzar con éxito el demonio.

Método 2: Poner script en una ubicación con menos seguridad

Como señaló @user3439894, ya que la principal razón por la que era difícil de ejecutar netspeed en primer lugar era que lo tenía en ~myself/Documents.../ que tiene requisitos de permisos elevados, también puedo ponerlo en una ubicación con menos seguridad.

He seguido la sugerencia de probar /Users/Shared/.../netspeed ¡y efectivamente funcionó con mi script original y el contenido del plist! Para que quede claro, el ProgramaArgumentos sería ahora:

<key>ProgramArguments</key>
<array>
    <string>/Users/Shared/.../netspeed</string>
</array>

0voto

user43889 Puntos 266

El programa que quieres ejecutar es bash, por lo que los argumentos del programa deben ser:

    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>/Users/myself/Documents/bin/iperf/netspeed</string>
    </array>

Pero sospecho que todavía puede obtener errores de la caja de arena. Para evitarlo utiliza el comando fdautil que forma parte de Control de lanzamiento . Entonces, usa:

<key>ProgramArguments</key>
<array>
    <string>/usr/local/bin/fdautil</string>
    <string>exec</string>
    <string>/bin/bash</string>
    <string>/Users/myself/Documents/bin/iperf/netspeed</string>
</array>

Este es el mecanismo que he utilizado para lanzar un script de Python (con la obvia diferencia).

Esta respuesta puede ser incompleta, pero a ver cómo te va.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X