Esecuzione di uno script come root e presentazione di una GUI per l'accesso agli utenti

1

Ho un problema di decisione di programmazione e spero che tu possa mostrarmi una soluzione o dirmi se il mio piano su come risolvere il problema sarebbe ok o meno.

Sto gestendo alcuni mac e voglio eseguire uno script ogni volta che un utente accede. Lo script (che non ho ancora scritto) deve apportare alcune modifiche (o meno). Le modifiche richiedono i privilegi di amministratore, ma lo script necessita anche delle informazioni dell'utente attualmente connesso (o accesso).

Normalmente, questo sarebbe un lavoro per un LaunchAgent / Deamon, ma qui viene il problema: gli script in / LaunchDeamons vengono eseguiti come amministratore di sistema ma iniziano insieme al sistema. Non sono a conoscenza degli utenti che accedono o escono e potrebbero non mostrare una GUI. ~ / LaunchAgents viene eseguito come utente connesso e inizia quando l'utente esegue l'accesso. Inoltre può mostrare una GUI. Tuttavia non vengono eseguiti come amministratore di sistema.

Quindi questo è il mio problema: eseguire uno script come root, ma avviarlo ogni volta che un utente accede e presenta a lui una GUI: La mia soluzione sarebbe quella di scrivere due script:

Lo script 1 viene eseguito come amministratore di sistema e si trova in / LaunchDeamons. Questo avrebbe un socket aperto per le connessioni in entrata (AKA "Server Socket").

Lo script 2 viene eseguito mentre l'utente si è connesso e si trova in ~ / LaunchAgents. Presenta una GUI all'utente e invia le informazioni allo script 1 tramite una connessione socket.

Non mi sembra che questa sarebbe la soluzione più affidabile / semplice, ma non riesco a pensare ad altro. Ho anche provato a scoprire come altri programmi risolvono questo problema (munki ad esempio, che presenta una GUI all'utente ma installa programmi come amministratore di sistema) ma non riesce a capire come l'hanno fatto.

Sarei felice per alcuni commenti su questo! Saluti, Christian

PS: ho intenzione di usare python.

    
posta Christian 04.09.2015 - 19:15
fonte

1 risposta

1

Socket: coinvolti ma provati e testati

La soluzione di due script che comunicano attraverso un socket è l'approccio collaudato. Lo abbiamo fatto per Power Manager e ha funzionato in modo affidabile da OS X 10.3 - 10.11.

A questo scopo puoi utilizzare un socket dominio TCP o UNIX.

Nella nostra situazione, il demone pmd viene eseguito come un processo a livello di computer e il daemon della sessione utente pmuser viene eseguito una volta per utente. Parlano per condividere le informazioni che un demone a livello di computer non può ottenere in modo sicuro e per eseguire azioni all'interno di sessioni utente specifiche.

Il demone wide computer può rilevare quando un utente esegue il login. Questo viene fatto attraverso l'API di SystemConfiguration SCDynamicStoreKeyCreateConsoleUser .

Lo script grafico deve essere lanciato all'interno della sessione utente grafica; un lavoro di avvio in /Library/LaunchDaemons con la coppia di valori chiave LimitLoadToSessionType : Aqua set lo garantirà.

A seconda delle informazioni che devi raccogliere dall'utente, mi aspetto che ciò che vuoi ottenere sia possibile con Power Manager; sentiti libero di entrare in contatto .

launchbtl's bsexec

Le versioni recenti di OS X includono un launchctl che promette ciò di cui hai bisogno: la possibilità di avviare un processo all'interno di una sessione utente. Vedi Come lanciare un'applicazione GUI in sessione grafica di un altro utente per i dettagli e i probabili problemi che incontrerai.

Se stai distribuendo su OS X 10.10 e versioni successive, esamina le nuove funzionalità del dominio di launchd. Una completa riscrittura in OS X 10.10 ha aperto molte opzioni non ancora completamente documentate. La mailing list di lancio è un tesoro di informazioni.

    
risposta data 04.09.2015 - 19:40
fonte

Leggi altre domande sui tag