Indurre l'accesso grafico Mac da SSH


16

Come induco l'accesso grafico Mac da SSH? Esiste un modo per loginwindowavviare il processo una sessione utente eseguendo un comando quando si accede in remoto tramite SSH come amministratore su Mac OS X?

Quando la macchina è nella finestra di accesso (nessun utente è attualmente connesso), voglio che apra la sessione di un utente come se avessi fatto clic sul nome utente e immesso una password.

Le soluzioni che non prevedono lo scripting della GUI sono altamente preferite, ma questa pagina di Apple KB potrebbe essere di interesse per coloro che seguono questa strada.

Risposte:


4

Non conoscere la password rende le cose complicate, ma forse la soluzione è: è possibile cancellare temporaneamente la password di un utente? (E successivamente ripristinalo a qualsiasi cosa fosse prima.)

Come inizio:

Innanzitutto, visualizza la finestra di accesso da visualizzare. Basta disconnettere l'utente corrente, utilizzare la commutazione rapida dell'utente o utilizzare SSH:

cd "/ Sistema / Libreria / CoreServices / Menu Extra / User.menu / Contenuti / Risorse /"
sudo ./CGSession -suspend

Oppure, per passare subito a un utente specifico, che probabilmente mostrerà la finestra di accesso (questo all'improvviso non funziona più sul mio 10.5 Leopard):

sudo ./CGSession -switchToUserID 501

Ciò che viene mostrato ora dipende un po 'dalle Preferenze di Sistema, ma supponiamo che siano le icone degli utenti e i loro nomi. Per attivare un nome dovremmo digitare le prime lettere. Quindi, dopo Return, viene visualizzata la richiesta della password. In alternativa si può scegliere qualsiasi nome (come premendo freccia giù) e quindi premere Opzione-A capo deve essere richiesto sia per qualsiasi nome utente e la relativa password. Non so come si possa dire quale schermata viene mostrata, ma salviamola per dopo ...

Quindi, per selezionare il primo nome utente (casuale) e premere Opzione-Invio, digitare un nome utente specifico, premere Invio e digitare la password:

sudo osascript -e 'dire all'app "Eventi di sistema"
  codice chiave 125
  la pressione del tasto ritorna usando l'opzione giù
  sequenza di tasti "il nome utente"
  ritardo 1.0
  sequenza di tasti
  ritardo 1.0
  sequenza di tasti "la password"
  ritardo 1.0
  sequenza di tasti
fine dire

Quanto sopra mostra qualche errore, che per quanto ne so non limita l'uso:

osascript [285]: 3891612: (connectAndCheck) Le app non attendibili non lo sono 
    autorizzato a connettersi o avviare Windows Server prima dell'accesso.
_RegisterApplication (), NON RIUSCITO A stabilire la connessione predefinita a
    il WindowServer, _CGSDefaultConnection () è NULL.

In alternativa, utilizza lo script specifico della lingua da " Script della finestra di accesso tramite Apple Remote Desktop " (forse un giorno i commenti su quel sito mostreranno una soluzione migliore):

dire al processo "SecurityAgent"
  imposta il valore del campo di testo 1 del gruppo 1 della finestra 1 su "nome utente"
  imposta il valore del campo di testo 2 del gruppo 1 della finestra 1 su "la password"
fine dirlo
fare clic sul pulsante "Accedi" della finestra 1 del processo di applicazione "SecurityAgent"

Ma il problema principale è: questo richiede ancora la password . Tuttavia: ovviamente non è necessaria alcuna password quando un utente ha una password vuota. In effetti, per le password vuote è sufficiente fare clic sull'icona di un utente. Quindi, se l'invio di sequenze di tasti utilizzando AppleScript è accettabile, forse "tutto" rimane da capire:

  • È possibile cancellare temporaneamente la password di un utente, per consentire l'avvio (o la ripresa) della sessione senza conoscere quella password ...?

  • Si può rendere AppleScript a prova di errore? Piace:

    • Come sapere se la finestra di accesso è visibile? (forse stat -f%Su /dev/consolepuò essere d'aiuto, dato che si ottieneroot mentre viene visualizzata la finestra di accesso)
    • Come dire quale finestra di accesso è mostrata? (Come: una che mostra icone e nomi di accesso, o un elenco a discesa, o forse solo una richiesta di password se qualcuno ha scelto di passare a un utente specifico?)
    • Sbarazzati dei ritardi.
    • Che dire di quel messaggio di errore?

(Una nota per il test: quando si utilizza la condivisione dello schermo sembra che l'impostazione della preferenza Quando si controllano i computer: Crittografa password e sequenze di tasti mantiene anche la connessione solo quando viene visualizzata la finestra di accesso o dopo che un utente ha effettuato correttamente l'accesso. Quando si utilizza Crittografa tutta la rete dati quindi il mio Mac ha bisogno di ristabilire la connessione condivisione dello schermo ogni volta che un account di accesso viene visualizzata o un utente viene commutata).


Questo è un buon inizio, ma ha due problemi. Innanzitutto, non funziona se sei nella finestra di accesso, che è quello che volevo, e chiede una password, che preferirei non aver fatto. Dal momento che è root, dovrebbe essere in grado di cambiare utente senza la password.
Sophie Alpert,

Aha. Non so nemmeno come accedere come un altro utente quando si è seduti al computer stesso, quindi nessun sigaro per sudo osascript -e 'tell app "System Events" to keystroke "password" & return'. Con lo schermo bloccato, inserendo un nome utente e una password di amministrazione si riprende la sessione dell'altro utente. Ma come avviare una sessione per qualsiasi utente senza conoscere la password? (Per essere sicuri, se si conosce la password: un'altra soluzione potrebbe essere la condivisione dello schermo, che funziona anche per la schermata di accesso. Sarà necessario ricollegare la condivisione dello schermo dopo l'avvio o la ripresa di una sessione utente specifica.)
Arjan

Questo è buono. Preferirei una soluzione senza simulare manualmente i tasti, tuttavia.
Sophie Alpert,

2
Mi chiedo se qualcuno sappia come iniziare una sessione per qualcun altro. Quindi, senza considerare la risposta sopra, solo nell'uso quotidiano di Mac OS X: un amministratore può accedere come un altro utente, senza conoscere la password di quell'utente? (Proprio come sual prompt dei comandi, ma poi per una sessione della GUI. O proprio come quando lo schermo è bloccato, in cui l'inserimento di un nome utente e una password di amministrazione riprende la sessione dell'altro utente.)
Arjan

Forse non è possibile farlo senza la pressione dei tasti AppleScript: docs.info.apple.com/article.html?path=RemoteDesktop/3.0/en/…
Sophie Alpert,

1

Ho studiato questo di recente.

Mettilo nello stack PAM della tua app o prova con sshd:

session    required       pam_launchd.so launchd_session_type=Aqua

Questo aiuta molto a farti avere una sessione grafica che è abbastanza vicina a una sessione utente disattivata. In particolare, si trova nello spazio dei nomi bootstrap giusto e ha le porte bootstrap corrette (credo). Puoi controllare la fonte per cosa fa pam_launchd; sta usando alcune librerie private dall'aspetto ragionevole (funzioni vproc_priv.h in libvprop) per chiamare le routine Mach per impostare le porte e lo spazio dei nomi. Corrisponde a tutti i documenti (limitati) forniti da Apple per le syscalls derivate da Mach.

Successivamente, devi impostare il tuo ID utente di controllo su quello dell'utente con l'API BSM, altrimenti la finestra di accesso non ti parlerà su Lion.

La sessione sembra molto simile a una sessione disattivata ora se si seleziona "blist launchctl" e alcuni processi e servizi prendono vita bene (come il pannello di montaggio e così via). In effetti, tutto tranne il Finder e la finestra di accesso sono in esecuzione. Fino a quando non viene eseguito loginwindow, non è possibile avviare un'applicazione grafica e il processo loginwindow per sessione viene sempre generato come figlio diretto di quello globale. Come si fa a colpire il processo di loginwindow per avviare una nuova loginwindow nella nuova sessione? Non riesco a trovare un modo per mettere a posto l'ultimo pezzo!

Qualsiasi aiuto per completare questa risposta è stato grato.


0

l'esecuzione del comando con sudo consente di impostare lo script su illeggibile dagli utenti standard. Non è perfetto, ma se il tuo utente amministratore è già compromesso, il gioco è finito comunque!

nome script chmod

il mio script è simile al seguente, funziona in remoto quando un utente è già in esecuzione, per passare a un secondo utente tramite SSH (testato su Snow Leopard 10.6.3):

#!/bin/bash
#go to login window
/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -switchToUserID 503

osascript -e 'tell app "System Events"
keystroke "password"
  delay 1.0
  keystroke return
end tell'

exit

0

Avevo bisogno di registrare lo stesso utente in 25 diverse workstation, al fine di fare un aggiornamento del software. Non sono stato in grado di eseguire il comando 'osascript -e ...' in modo affidabile dalle sessioni SSH, anche con i privilegi di sudo. Tuttavia, sono stato in grado di eseguirlo tramite Apple Remote Desktop. Se hai l'ARD:

  1. seleziona le tue macchine
  2. svegliarli e disconnetterli da altri utenti, se necessario
  3. scegli "Invia comando UNIX ..." dal menu "Gestisci"
  4. incolla lo script di Arjan (omettendo la parola 'sudo') nella finestra di dialogo dei comandi
  5. seleziona e inserisci "Esegui comando come: Utente: root"

Sono stato felice di trovare tutti i 25 Mac Mini che eseguono Finder come utente, in meno di un minuto. Solo per ribadire, con ARD non è necessario digitare la password sudo su ogni macchina. Le righe che devi incollare nella finestra di dialogo dei comandi sono (sostituendo un nome utente e una password validi):

osascript -e 'tell app "System Events"
  key code 125
  keystroke return using option down
  keystroke "the username"
  delay 1.0
  keystroke return
  delay 1.0
  keystroke "the password"
  delay 1.0
  keystroke return
end tell'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.