Ho una serie di script che devono essere eseguiti all'avvio del sistema e rimangono attivi. Ho il plist salvato come /Library/LaunchAgents/net.vps.tunnel.plist e ha le autorizzazioni appropriate:
-rw-r--r-- 1 root wheel 516 Nov 6 22:03 net.vps.tunnel.plist
Lo script è archiviato nella directory /Library/LaunchAgents
, NON nella directory ~/Library/LaunchAgents
dell'utente, quindi dovrebbe essere eseguito all'avvio come superutente. Se eseguo manualmente lo script tramite sudo launchctl load /Library/LaunchAgents/net.vps.tunnel.plist
, viene eseguito correttamente. Ma nonostante il fatto che dovrebbe funzionare all'avvio, non è così. Quando controllo launchctl list
immediatamente dopo l'avvio, vedo che non è stato caricato. Il tentativo di iniziare tramite sudo launchctl start net.vps.tunnel
fallisce con l'errore "launchctl start error: No such process".
Se accedo tramite la GUI, all'improvviso launchd carica tutti gli script. Tuttavia, vengono eseguiti con i miei permessi utente e alcuni di essi non funzionano correttamente. Nei plists, ho specificato la chiave UserName come utente daemon, ma tutti vengono eseguiti con le credenziali dell'utente.
Ecco il file plist in questione, situato in /Library/LaunchAgents/net.vps.tunnel.plist e con -rw-r - r-- autorizzazioni per root: wheel:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>net.vps.tunnel</string>
<key>ProgramArguments</key>
<array>
<string>/Users/_tunnel/tunnel.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/Users/_tunnel</string>
<key>UserName</key>
<string>_tunnel</string>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
Ed ecco lo script del tunnel, con autorizzazioni -rwxr-x --- per _tunnel: _tunnel:
#/bin/bash
logger "Opening VPS tunnel..."
ssh -i ./.ssh/id_rsa -gnN tunnel@********.com &
PID=$!
logger "VPS tunnel is now open."
wait $PID
logger "VPS tunnel is now closed."
exit 0