¿Cómo ejecuto Launchd como root?

0

Estoy intentando bloquear algunos sitios web a través de / etc / hosts
Parece que no puedo averiguar cómo ejecutar LaunchAgent con los permisos correctos.

$ ls -la ~/Library/LaunchAgents/hosts_Blocksites_AM.plist     
-rw-r--r--@ 1 root  staff  1854 Aug 25 11:55 /Users/bryanwheelock/Library/LaunchAgents/hosts_Blocksites_AM.plist    

Establecí una clave de nombre de usuario:

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

Aquí está el host_Blocksites_AM.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>local.job</string>  
    <key>ProgramArguments</key>  
    <array>  
        <string>cp</string>  
        <string>/etc/hosts_BLOCKED_sites.txt</string>  
        <string>/etc/hosts</string>  
    </array>  
    <key>RunAtLoad</key>  
    <true/>  
    <key>UserName</key>  
    <string>root</string>  
    <key>StartCalendarInterval</key>  
    <array>  
        <dict>  
            <key>Hour</key>  
            <integer>8</integer>  
            <key>Minute</key>  
            <integer>15</integer>  
            <key>Weekday</key>  
            <integer>1</integer>  
        </dict>  
        <dict>  
            <key>Hour</key>  
            <integer>8</integer>  
            <key>Minute</key>  
            <integer>15</integer>  
            <key>Weekday</key>  
            <integer>2</integer>  
        </dict>  
        <dict>  
            <key>Hour</key>  
            <integer>8</integer>  
            <key>Minute</key>  
            <integer>15</integer>  
            <key>Weekday</key>  
            <integer>3</integer>  
        </dict>  
        <dict>  
            <key>Hour</key>  
            <integer>8</integer>  
            <key>Minute</key>  
            <integer>15</integer>  
            <key>Weekday</key>  
            <integer>4</integer>  
        </dict>  
        <dict>  
            <key>Hour</key>  
            <integer>8</integer>  
            <key>Minute</key>  
            <integer>15</integer>  
            <key>Weekday</key>  
            <integer>5</integer>  
        </dict>  
    </array>  
    <key>StandardErrorPath</key>                                                                                                                                                          
    <string>/tmp/mycommand.err</string>                                                                                                                                       
    <key>StandardOutPath</key>                                                                                                                                                                <string>/tmp/mycommand.out</string>  
</dict>  
</plist>  

Aquí están los errores:

$ cat /tmp/mycommand.err   
sudo: no tty present and no askpass program specified  
cp: /etc/hosts: Permission denied  

Intenté agregar el comando sudo a los argumentos del programa, pero no creo que fuera correcto.

EDITADO:

Clave de etiqueta modificada:

<key>Label</key>  
<string>local.hosts.blockingAM</string>  

Se eliminó la clave de nombre de usuario.

Se movió el nombre de lista y cambio:

$ ls -la /Library/LaunchDaemons/
-rw-r--r--@  1 root  wheel  1474 Aug 29 13:19 local.hosts.blockingAM.plist  

Todavía estaba recibiendo errores de permiso hasta que ejecuté launchctl con sudo:

sudo launchctl load /Library/LaunchDaemons/local.hosts.blocking.plist 
    
pregunta BryanWheelock 26.08.2016 - 16:58

2 respuestas

3

Los agentes de lanzamiento se ejecutan cuando un usuario inicia sesión. Por lo tanto, al agregar un plist en ~ / Library / LaunchAgents y al cargarlo / iniciarlo, se ejecutará una tarea en nombre del usuario registrado, y solo este, porque ningún otro usuario Tiene acceso a esta carpeta. No puede ejecutar un agente de inicio con los derechos de otro usuario y la clave UserName no es una opción válida allí.

Un agente de lanzamiento en / Library / LaunchAgents también se ejecutará en el ámbito del usuario que inició sesión. Pero cada usuario que inicie sesión lo iniciará. Por lo tanto, dos usuarios registrados al mismo tiempo iniciarán cada uno una tarea de agente arbitraria con los derechos / permisos respectivos.

Las carpetas LaunchAgents y LaunchDaemons del sistema se encuentran en el área prohibida, por lo que se queda creando un demonio de inicio en / Library / LaunchDaemons.

Dado que los daemons de lanzamiento ya se ejecutan con permisos de raíz, use el siguiente local.hosts.blocking.plist en / Library / LaunchDaemons / (convenciones de nomenclatura respecto al archivo de etiqueta / error y archivo de salida estándar ya incluido):

<?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>local.hosts.blocking</string>  
    <key>ProgramArguments</key>  
    <array>  
        <string>cp</string>  
        <string>/etc/hosts_BLOCKED_sites.txt</string>  
        <string>/etc/hosts</string>  
    </array>  
    <key>StartCalendarInterval</key>  
    <array>  
        <dict>  
        ....
        </dict>  
    </array>  
    <key>StandardErrorPath</key>                                                                                                                                                          
    <string>/tmp/local.hosts.blocking.err</string>
    <key>StandardOutPath</key> 
    <string>/tmp/local.hosts.blocking.out</string>  
</dict>  
</plist>

Aplique permisos estándar al plist: root: wheel / 644 y cárguelo / comience con:

sudo launchctl load /Library/LaunchDaemons/local.hosts.blocking.plist
    
respondido por el klanomath 26.08.2016 - 18:40
0

El autor de la pregunta menciona a LaunchAgents un par de veces y la respuesta de @klanomath es correcta: en este caso, probablemente, LaunchDaemon sea el enfoque adecuado.

Sin embargo, para los Googlers que están tratando de otorgar un LaunchAgent de privilegios elevados de sudo / root, recomiendo revisar o esta respuesta en esta pregunta sobre los Agentes de lanzamiento .

Describe un método para tener privilegios selectivamente elevados para el usuario y el comando que está ejecutando, permitiendo que launchctl ejecute sudo sin una solicitud de contraseña interactiva.

    
respondido por el Cory Klein 29.06.2017 - 22:26

Lea otras preguntas en las etiquetas