C'è un modo per caricare un LaunchAgent come un altro utente?

2

Da uno script eseguito come root copio un LaunchAgent .plist a /Users/xyz/Library/LaunchAgents .

Se lo carico tramite launchctl loggato come utente xyz funziona senza problemi. Se provo a caricarlo dallo script con il seguente comando:

sudo -u xyz launchctl load /Users/xyz/Library/LaunchAgents/x.y.z.plist

non funziona. Il messaggio di errore è

Could not open job overrides database at /private/var/db/launchd.db/com.apple.launchd.peruser.0/overrides.plist: 13: Permission denied  
launch_msg(): Socket is not connected

C'è qualche altro modo per portare a termine il mio compito?

    
posta Tycho Sjögren 24.08.2012 - 16:46
fonte

2 risposte

4

Mi sembra che l'errore delle autorizzazioni sia solo un sintomo di un problema molto più profondo: stai provando a caricare l'elemento nel mach bootstrap context . In particolare, stai eseguendo il comando launchctl come xyz, ma sta cercando di caricare l'elemento nel contesto di root, che xyz non ha i permessi da fare. Quello che vuoi è quello di caricare l'oggetto nel contesto di xyz (che xyz dovrebbe avere il permesso di fare).

Ok, fammi un po 'di backup, e ti do un po' di un riassunto della gerarchia launchd in OS X. Quando il sistema operativo si avvia, avvia un'istanza master di launchd (il "sistema" launchd), che carica elementi dalle varie cartelle Libreria / LaunchDaemon.

Quando un utente effettua l'accesso (o in altro modo avvia una "sessione"), viene creato un nuovo "contesto di bootstrap", viene avviata una nuova istanza di launchd (il "utente" launchd) (nel nuovo contesto) che carica gli elementi dalle varie cartelle Library / LaunchAgents (tutte all'interno di quel nuovo contesto).

Quando usi sudo -u xyz ... , cambia gli ID utente in xyz, ma non passa al contesto di xyz.

Ora, ci sono un paio di casi qui: in primo luogo, se xyz non è loggato (cioè non ha una sessione attiva), non hanno un contesto bootstrap o un'istanza launchd, quindi puoi ' t carica un LaunchAgent come loro. Fondamentalmente, i LaunchAgent vengono caricati nelle sessioni utente, quindi se non ci sono sessioni, non c'è nulla in cui caricarle. D'altro canto, questo non dovrebbe essere un problema: la prossima volta che xyz si collega, il tuo articolo verrà caricato automaticamente (purché sia nel posto giusto).

Se xyz è loggato, puoi ottenere l'ID di processo di qualche processo all'interno della loro sessione e usare launchctl bsexec per passare al contesto bootstrap di quel processo (e poi usare sudo -u xyz per passare UID a xyz e quindi caricare l'elemento):

loadUser=xyz
loadPID=$(ps -axj | awk "/^$loadUser / {print \;exit}")
launchctl bsexec $loadPID sudo -u $loadUser launchctl load /Users/xyz/Library/LaunchAgents/x.y.z.plist
    
risposta data 25.08.2012 - 22:51
fonte
2

Ho scoperto che puoi farlo in due passaggi.

Prima sudo in root

sudo -s

Quindi impersonare l'utente

su -l user

Apparentemente questo stabilisce il contesto corretto e launchctl funziona.

    
risposta data 18.03.2014 - 16:43
fonte

Leggi altre domande sui tag