Come faccio a far funzionare il mio LaunchAgent come utente root?

7

Voglio eseguire un processo come root all'accesso utente.

Ho creato /System/Library/LaunchAgents/eXist.plist con le autorizzazioni 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>

Tuttavia, il mio processo continua a essere eseguito come mio utente davea invece di root. Qualche idea su cos'altro devo fare?

Uso Mac 10.9.1.

    
posta Dave 14.01.2014 - 04:54
fonte

6 risposte

2

Per ottenere un utente LaunchAgent che esegue uno script da eseguire come root, devi fare quanto segue:

Modifica le autorizzazioni dello script. Aggiungi lo script (o il comando) al file sudoers nel contesto dell'utente e infine aggiungi e carica un plist di avvio appropriato.

Questo approccio potrebbe creare gravi problemi di sicurezza!

Nell'esempio seguente utilizzo lo startup.sh di 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>
    

    e salvalo come org.eXist_DB.plist in ~ / Library / LaunchAgents

    L'ultima chiave:

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

    potrebbe non essere necessario. Nella mia VM era - per ragioni sconosciute.

  • Modifica le autorizzazioni di 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
    
  • Modifica il file sudoers:

    sudo visudo
    
  • aggiungi una linea per abilitare l'esecuzione di un comando senza la necessità di inserire la password 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
    
  • Infine inserisci:

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

    per caricare e avviare l'agente di avvio

risposta data 10.01.2016 - 21:48
fonte
2

Aggiungi la coppia di valori chiave per UserName :

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

Inserisci avvia ticket di lavoro in /Library/LaunchDaemons/ ; la cartella /System è riservata esclusivamente per l'utilizzo di Apple.

Per eseguire l'utente specificato, assicurati di inserire il ticket lavoro in LaunchDaemons . Come @Manu menziona nel commento qui sotto, la chiave UserName viene ignorata per i lavori in LaunchAgents .

    
risposta data 14.01.2014 - 09:57
fonte
1

Usa un loginhook. Sono deprecati ma funzionano ancora:

Mac OS X: creazione di un hook di accesso

    
risposta data 10.01.2016 - 22:11
fonte
0

Puoi utilizzare launchd-oneshot per installare un processo di accesso eseguito come root con

brew install cybertk/formulae/launchd-oneshot
sudo launchd-oneshot <script> --on-login-as-root
    
risposta data 21.01.2016 - 12:53
fonte
0
  • Non scherzare con nulla in /System/ a meno che tu non voglia rischiare di rovinare il tuo sistema. Sul serio. Stai lontano.

  • Metti in /Library/LaunchDaemons/ invece.

risposta data 14.01.2014 - 05:33
fonte
0

La creazione di un LaunchAgent che viene eseguito con privilegi sudo / root può essere fatto semplicemente con sudo come comando da eseguire LaunchAgent.

Crea file PList

Prova a inserire questo esempio minimale in ~/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: gli agenti dovrebbero in genere avere la proprietà dei file dell'utente, ma la proprietà root sembra funzionare altrettanto bene.

L'esempio precedente esegue sudo touch /tmp/sudoexample e registra l'output su /tmp/sudoexample.log .

Se esegui launchctl load ~/Library/LaunchAgents/com.sudoexample.plist a questo punto, fallirà perché sudo proverà a richiedere una password e launchctl non ha alcun tty associato per servire il prompt della password:

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

Consenti privilegi elevati

Dobbiamo concedere al tuo utente il permesso di eseguire sudo touch senza password.

Questo può essere fatto in questo modo:

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

Quando hai finito, il file dovrebbe apparire in questo modo:

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

Provalo

$ 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

Ora puoi vedere avviato LaunchAgent creando la proprietà di root /tmp/sudoexample .

Grazie alla risposta di klanomath per aver fornito le basi per questo.

    
risposta data 29.06.2017 - 22:16
fonte

Leggi altre domande sui tag