Come faccio a scrivere script per forzare la disconnessione di un altro utente desktop da OS X?

1

Stiamo eseguendo test che richiedono più desktop su un Mac Mini.

Stiamo utilizzando con successo un tunnel TCP ssh su localhost, da 5900 a 6900, per fare in modo che Screen Sharing ci permetta di accedere ad altri utenti su questo stesso computer con vnc: // user: password @ localhost: 6900 e alcuni Applescript da premere i pulsanti di dialogo risultanti. Riesco a rilevare l'accesso riuscito tramite ssh eseguendo un programma in Java 1.7 con export AWT_TOOLKIT=CToolkit che tenta di aprire una finestra AWT come utente secondario, che non riesce se il desktop non è avviato.

Questo è abbastanza affidabile, anche se mi piacerebbe sapere di metodi più affidabili!

Dove le cose stanno andando male:

Stiamo riscontrando problemi nel registrare questi utenti robot, per lasciare la macchina fresca per altri test che obiettano a tutta la memoria sprecata dai processi vaganti che gli utenti lasciano in esecuzione.

Attualmente sto usando

for i in $users ; do
  ssh ${i}@localhost "osascript -e 'tell application \"System Events\"'
                                  -e 'log out'
                                  -e 'delay 3'
                                  -e 'keystroke return'
                                -e end" &
done; wait

ma a volte System Events a quanto pare non è in esecuzione e si rifiuta di iniziare:

33:40: execution error: System Events got an error: Application isn’t running. (-600)

Di recente ho aggiunto -e 'if it is not running then launch' -e 'delay 5' immediatamente prima del -e 'log out' , ma sembra che non ci sia molto da aiutare.

Ho pensato che sostituire tutte le cose di Applescript con alcune varianti di ssh kill -KILL -1 avrebbe funzionato, almeno come back-up per gli utenti di holdout il cui System Events è rotto, ma lascia un buon paio di dozzine di CoreServices , PrivateFrameworks e Framework GUI: sembrano le cose in esecuzione, la maggior parte delle quali si rifiutano di morire anche con kill -9 puntato manualmente ai loro PID. Ho provato con uno script a due stadi, catturando l'output di killall -s in un file e spruzzandolo in una seconda sessione ssh.

Esiste un modo più affidabile per registrare questi utenti e uccidere tutti i loro processi? Ho i diritti di amministrazione sulla scatola, ma preferirei qualcosa sulla riga di comando di Unix per evitare di scrivere ulteriori dolorosi AppleScript per manipolare la GUI.

Grazie!

    
posta android.weasel 11.03.2016 - 16:07
fonte

1 risposta

0

Ho trovato quello che sembra un percorso praticabile, ma è indelicato:

Elimina il processo 'loginwindow' per un utente (come root - l'utente non può uccidere il proprio processo (!)) (nota, il [n] impedisce che l'espressione regolare corrisponda a se stesso), quindi usa kill -9 -1 per catturare il resto del pasticcio:

    $ for i in $users; do
       echo $pword |
       ssh $i@localhost '
         sudo -S kill -9 $(
           ps -axf | awk "/^ *$(id -u '$i') .*logi[n]window/{ print \ }"
         );
         kill -9 -1
       ';
      done

Lascia due processi attorno

  • /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared
  • / usr / sbin / cfprefsd agent

... che le varie pagine di mac affermano sono normali strane di OS X.

Non mi piace particolarmente questa soluzione, perché è così brusco e sono preoccupato di lasciare cose come i simulatori di telefoni iOS o altri file in stati incoerenti, ma l'assenza di un'altra risposta, sembra che io abbia poca altra scelta .

Almeno posso usare questo come backup di emergenza per quando il percorso di Applescript fallisce, e kill -9 -1 riordina ciò che il processo di logout normale ma scadente di Apple lascia in giro comunque.

Noterò anche che fare qualcosa con più utenti desktop mi ha scombinato la connettività di rete, apparentemente a causa di Apple che non si preoccupava di pensare a come le reti autenticate dovrebbero comportarsi.

    
risposta data 13.03.2016 - 23:22
fonte

Leggi altre domande sui tag