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.