0 votos

¿Cómo se ejecuta Launchd como Root?

Estoy tratando de bloquear algunos sitios web a través de /etc/hosts
No consigo averiguar cómo ejecutar el 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    

He establecido una clave UserName:

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

Aquí está el hosts_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  

Había intentado añadir el comando sudo a los argumentos del programa, pero creo que no era correcto.

EDITADO:

Cambio de la clave de la etiqueta:

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

Se ha eliminado la clave UserName.

Movido el plist y cambiado el nombre:

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

Seguía recibiendo errores de permisos hasta que ejecuté launchctl con sudo:

sudo launchctl load /Library/LaunchDaemons/local.hosts.blocking.plist

1 votos

Empieza por cambiar la etiqueta por el nombre del plist- hosts_Blocksites_AM

4voto

klanomath Puntos 19587

Los agentes de lanzamiento se ejecutan cuando un usuario se conecta. Así que añadiendo un plist en ~/Library/LaunchAgents y cargándolo/iniciándolo, se ejecutará una tarea en nombre del usuario que ha iniciado la sesión - y sólo éste, porque ningún otro usuario tiene acceso a esta carpeta. No se puede ejecutar un agente de lanzamiento 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 conectado. Pero cada usuario que se conecte lo iniciará. Así que dos usuarios que inicien sesión al mismo tiempo, cada uno iniciará una tarea de agente arbitraria con los respectivos derechos/permisos.

Las carpetas LaunchAgents y LaunchDaemons del sistema son áreas prohibidas, por lo que se queda creando un demonio de lanzamiento en /Library/LaunchDaemons.

Dado que los demonios de lanzamiento ya se ejecutan con permisos Root, utilice el siguiente plist local.hosts.blocking.plist en /Librería/LaunchDaemons/ (las convenciones de nomenclatura relativas al archivo de etiquetas/errores y al archivo de salida estándar ya están incluidas):

<?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>

Aplica los permisos estándar al plist: Root:wheel/644 y cárgalo/inícialo con:

sudo launchctl load /Library/LaunchDaemons/local.hosts.blocking.plist

0 votos

Gracias por la respuesta. Hice los cambios sugeridos y todavía me da un error de permiso. He publicado los cambios en OP.

0 votos

He copiado exactamente tu plist y me sale exactamente el mismo error de permisos:

0 votos

$ ls /Library/LaunchDaemons/local.hosts.blocking.plist -rw-r--r-- 1 Root wheel 1002 Ago 29 16:43 /Library/LaunchDaemons/local.hosts.blocking.plist

1voto

fravelgue Puntos 1119

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

Sin embargo, para los Googlers que son tratando de dar un LaunchAgent privilegios elevados de sudo/root, recomiendo revisar o esta respuesta en esta pregunta sobre LaunchAgents .

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

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