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

Quiero ejecutar un process como root en el inicio de session del usuario.

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

 <?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 process continúa ejecutándose como mi usuario davea lugar de root. ¿Alguna idea de qué más tengo que hacer?

Estoy usando Mac 10.9.1.

6 Solutions collect form web for “¿Cómo hago para que mi LaunchAgent se ejecute como root?”

Para hacer que un usuario LaunchAgent ejecute una secuencia de commands para ejecutar como root, debe hacer lo siguiente:

Modificar los permissions del script Agregue la secuencia de commands (o command) al file sudoers en el context del usuario y, finalmente, agregue y cargue un plist agente de lanzamiento adecuado.

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


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

  • Crea 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árdalo como org.eXist_DB.plist en ~ / Library / LaunchAgents

    La última key:

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

    podría no ser necesario. En mi máquina virtual fue, por razones desconocidas.

  • Modificar los permissions 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 file sudoers:

     sudo visudo 
  • agregue una línea para habilitar la ejecución de un command sin la necesidad de ingresar la contraseña de 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 

    cargar e iniciar el agente de inicio

Use un inicio de session. Están en desuso, pero aún funcionan:

Mac OS X: creación de un enlace de inicio de session

Agregue el par de valores key para UserName :

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

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

Para ejecutar como el usuario especificado, asegúrese de colocar el ticket de trabajo en LaunchDaemons . Como @Manu menciona en el comentario siguiente, la key UserName se ignora para trabajos en LaunchAgents .

Puede usar launchd-oneshot para instalar un trabajo de inicio de session ejecutado como root con

 brew install cybertk/formulae/launchd-oneshot sudo launchd-oneshot <script> --on-login-as-root 
  • No te metas con nada en /System/ less que quieras arriesgar a atornillar tu sistema. Seriamente. Mantente alejado.

  • Ponlo en /Library/LaunchDaemons/ lugar.

La creación de un LaunchAgent que se ejecuta con privilegios sudo / root se puede hacer simplemente teniendo sudo el command que ejecuta LaunchAgent.

Crear file PList

Intenta 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 suelen tener la propiedad del file de usuario, pero root propiedad root 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 ningún tty asociado para launchctl la request de contraseña:

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

Permitir privilegios elevados

Necesitamos otorgarle permiso a su usuario 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 file debería verse más o less así:

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

Pruébalo

 $ 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ó exitosamente al crear la raíz poseída /tmp/sudoexample .

Gracias a la respuesta de Klanomath por proporcionar la base para esta.

Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).