¿Cómo hago para que mi LaunchAgent se ejecute como root?

7

Quiero ejecutar un proceso como root en el inicio de sesión del usuario.

Creé /System/Library/LaunchAgents/eXist.plist con rx—r—r— permisos:

<?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>Disabled</key>
        <false/>
        <key>GroupName</key>
        <string>wheel</string>
        <key>Label</key>
        <string>eXist DB</string>
        <key>Program</key>
        <string>/Applications/eXist-db/bin/startup.sh</string>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/tmp/eXist DB.err</string>
        <key>StandardOutPath</key>
        <string>/tmp/eXist DB.out</string>
        <key>UserName</key>
        <string>root</string>
    </dict>
</plist>

Sin embargo, mi proceso continúa ejecutándose como mi usuario davea en lugar de root. ¿Alguna idea de qué más necesito hacer?

Estoy usando Mac 10.9.1.

    
pregunta Dave 14.01.2014 - 04:54

6 respuestas

2

Para que un usuario LaunchAgent ejecute un script que se ejecute como root, debe hacer lo siguiente:

Modificar los permisos del script. Agregue el script (o comando) al archivo sudoers en el contexto del usuario y, finalmente, agregue y cargue una lista de agentes de lanzamiento adecuada.

¡Este enfoque podría crear graves agujeros de seguridad!

En el siguiente ejemplo, utilizo startup.sh de eXit-db 2.2:

  • Crear un 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>Disabled</key>
        <false/>
        <key>Label</key>
        <string>org.eXist_DB</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/bin/sudo</string>
            <string>/Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/tmp/eXist_DB.err</string>
        <key>StandardOutPath</key>
        <string>/tmp/eXist_DB.out</string>
        <key>ThrottleInterval</key>
        <integer>10</integer>
    </dict>
    </plist>
    

    y guárdelo como org.eXist_DB.plist en ~ / Library / LaunchAgents

    La última clave:

        <key>ThrottleInterval</key>
        <integer>10</integer>
    

    podría no ser necesario. En mi VM fue - por razones desconocidas.

  • Modificar los permisos de startup.sh:

    sudo chown root /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh
    sudo chmod 4755 /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh
    
  • Modificar el archivo sudoers:

    sudo visudo
    
  • agregue una línea para habilitar la ejecución de un comando sin la necesidad de ingresar la contraseña sudo

    # User privilege specification
    root    ALL=(ALL) ALL
    %admin  ALL=(ALL) ALL
    

    - >

    # User privilege specification
    root    ALL=(ALL) ALL
    %admin  ALL=(ALL) ALL
    your_user_name ALL=(ALL) NOPASSWD: /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh
    
  • Finalmente ingrese:

    launchctl load -w ~/Library/LaunchAgents/org.eXist_DB.plist
    

    para cargar e iniciar el agente de inicio

respondido por el klanomath 10.01.2016 - 21:48
2

Agregue el par de valores clave para UserName :

<key>UserName</key>
<string>root</string>

Coloque la ticket de trabajo launchd en codigo%; La carpeta /Library/LaunchDaemons/ está reservada exclusivamente para el uso de Apple.

Para ejecutar como el usuario especificado, asegúrese de colocar el ticket de trabajo en /System . Como @Manu menciona en el comentario a continuación, la clave LaunchDaemons se ignora para los trabajos en UserName .

    
respondido por el Graham Miln 14.01.2014 - 09:57
1

Use un loginhook. Están en desuso pero aún funcionan:

Mac OS X: creando un enlace de inicio de sesión

    
respondido por el Rich Trouton 10.01.2016 - 22:11
0

Puede usar launchd-oneshot para instalar un trabajo de inicio de sesión como root con

brew install cybertk/formulae/launchd-oneshot
sudo launchd-oneshot <script> --on-login-as-root
    
respondido por el Quanlong 21.01.2016 - 12:53
0
  • No te metas con nada en /System/ a menos que quieras arriesgarte a arruinar tu sistema. Seriamente. Mantente alejado.

  • Póngalo en /Library/LaunchDaemons/ en su lugar.

respondido por el TJ Luoma 14.01.2014 - 05:33
0

La creación de un LaunchAgent que se ejecuta con los privilegios de sudo / root se puede hacer simplemente haciendo que sudo sea el comando que ejecuta el LaunchAgent.

Crear archivo PList

Intente colocar este ejemplo mínimo en ~/Library/LaunchAgents/com.sudoexample.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.sudoexample</string>
        <key>ProgramArguments</key>
        <array>
            <string>sudo</string>
            <string>touch</string>
            <string>/tmp/sudoexample</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardOutPath</key>
        <string>/tmp/sudoexample.log</string>
        <key>StandardErrorPath</key>
        <string>/tmp/sudoexample.log</string>
    </dict>
</plist>

Nota: los agentes normalmente deben tener la propiedad del archivo del usuario, pero la propiedad root también parece funcionar bien.

El ejemplo anterior ejecuta sudo touch /tmp/sudoexample y registra la salida en /tmp/sudoexample.log .

Si ejecuta launchctl load ~/Library/LaunchAgents/com.sudoexample.plist en este punto, fallará porque sudo intentará solicitar una contraseña y launchctl no tiene% tty asociado para servir la solicitud de contraseña:

$ ls /tmp/
sudoexample.log
$ cat /tmp/sudoexample.log
sudo: no tty present and no askpass program specified

Permitir privilegios elevados

Necesitamos conceder a su usuario permiso para ejecutar sudo touch sin una contraseña.

Esto se puede hacer así:

echo "$(whoami) ALL=(ALL) NOPASSWD: $(which touch)" | sudo tee /etc/sudoers.d/touch

Cuando hayas terminado, el archivo debería verse así:

$ sudo cat /etc/sudoers.d/touch
coryklein ALL=(ALL) NOPASSWD: /usr/bin/touch

Prueba fuera

$ launchctl load ~/Library/LaunchAgents/com.sudoexample.plist
$ ls -l /tmp
total 0
-rw-r--r-- 1 root      wheel 0 Jun 29 14:01 sudoexample
-rw-r--r-- 1 coryklein wheel 0 Jun 29 14:01 sudoexample.log

Ahora puede ver que LaunchAgent se ejecutó con éxito al crear la raíz propiedad /tmp/sudoexample .

Gracias a la respuesta de klanomath por proporcionar las bases para esta.

    
respondido por el Cory Klein 29.06.2017 - 22:16

Lea otras preguntas en las etiquetas