Come faccio a lanciare Launchd come root?

0

Sto provando a bloccare alcuni siti web tramite / etc / hosts
Non riesco a capire come eseguire LaunchAgent con le autorizzazioni corrette.

$ 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    

Ho impostato un tasto UserName:

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

Ecco i 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>  

Ecco gli errori:

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

Avevo provato ad aggiungere il comando sudo agli argomenti del programma, ma non penso che fosse corretto.

A CURA:

Chiave etichetta modificata:

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

Chiave UserName rimossa.

Spostato il plist e il nome cambiato:

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

Stavo ancora ricevendo errori di autorizzazione fino a quando ho lanciato launchctl con sudo:

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

2 risposte

3

Gli agenti di lancio vengono eseguiti quando un utente esegue l'accesso. Quindi aggiungendo un plist in ~ / Library / LaunchAgents e caricandolo / avviarlo, eseguirà un'attività a nome dell'utente che ha effettuato l'accesso - e solo questa, perché nessun altro utente ha accesso a questa cartella. Non è possibile eseguire un agente di lancio con i diritti di un altro utente e la chiave UserName non è un'opzione valida.

Un agente di avvio in / Library / LaunchAgents verrà eseguito anche nel regno dell'utente connesso. Ma ogni utente che accede lo avvierà. Quindi, due utenti che hanno effettuato l'accesso contemporaneamente, inizieranno ciascuna un'attività di agente arbitrario con i rispettivi diritti / permessi.

Le cartelle LaunchAgent e LaunchDaemon del sistema sono aree vietate, quindi devi creare un demone di avvio in / Library / LaunchDaemons.

Poiché i daemon di lancio sono già in esecuzione con le autorizzazioni di root, utilizzare il seguente plist local.hosts.blocking.plist in / Library / LaunchDaemons / (convenzioni di denominazione relative al file etichetta / errore e file di output standard già inclusi):

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

Applica permessi standard al plist: root: wheel / 644 e carica / avvialo con:

sudo launchctl load /Library/LaunchDaemons/local.hosts.blocking.plist
    
risposta data 26.08.2016 - 18:40
fonte
0

Il richiedente menziona LaunchAgents un paio di volte e la risposta di @ klanomath è corretta: in questo caso, LaunchDaemon è probabilmente l'approccio appropriato.

Tuttavia, per i googler che stanno stanno tentando di assegnare a LaunchAgent privilegi sudo / root elevati, ti consiglio di controllare o questa risposta su questa domanda su LaunchAgents .

Descrive un metodo per avere privilegi selettivamente elevati per l'utente e il comando che stai utilizzando, consentendo a launchctl di eseguire sudo senza una richiesta interattiva di password.

    
risposta data 29.06.2017 - 22:26
fonte

Leggi altre domande sui tag