Induzieren Sie die grafische Anmeldung von Mac über SSH


16

Wie kann ich die grafische Anmeldung für den Mac über SSH veranlassen? Gibt es eine Möglichkeit, den loginwindowProzess zum Starten einer Benutzersitzung zu veranlassen, indem ein Befehl ausgeführt wird, wenn Sie über SSH als Administrator unter Mac OS X remote angemeldet sind?

Wenn sich das Gerät im Anmeldefenster befindet (derzeit ist kein Benutzer angemeldet), soll eine Benutzersitzung geöffnet werden, als hätte ich auf den Benutzernamen geklickt und ein Kennwort eingegeben.

Lösungen, bei denen keine Skripts für die Benutzeroberfläche erstellt werden, werden sehr bevorzugt. Diese Apple-KB-Seite ist jedoch möglicherweise für diejenigen von Interesse, die diesen Weg gehen.

Antworten:


4

Wenn Sie das Kennwort nicht kennen, wird es kompliziert, aber möglicherweise lautet die Lösung: Ist es möglich, das Kennwort eines Benutzers vorübergehend auszublenden? (Und setzen Sie es danach auf das zurück, was es vorher war.)

Als Start:

Lassen Sie zunächst das Anmeldefenster anzeigen. Melden Sie einfach den aktuellen Benutzer ab, verwenden Sie die schnelle Benutzerumschaltung oder verwenden Sie SSH:

cd "/ System / Library / CoreServices / Menü Extras / User.menu / Contents / Resources /"
sudo ./CGSession -suspend

Oder, um sofort zu einem bestimmten Benutzer zu wechseln, in dem wahrscheinlich das Anmeldefenster angezeigt wird (dies funktioniert auf meinem 10.5 Leopard plötzlich nicht mehr):

sudo ./CGSession -switchToUserID 501

Was jetzt angezeigt wird, hängt ein bisschen von den Systemeinstellungen ab, aber nehmen wir an, es sind die Symbole der Benutzer und ihre Namen. Um einen Namen zu aktivieren, müssten wir die ersten Buchstaben eingeben. Nach Return erscheint die Passwortabfrage. Alternativ kann man auswählen beliebigen Namen (z. B. durch Drücken des Pfeils nach unten) und dann die Optionstaste drücken, um zur Eingabe eines beliebigen Benutzernamens und seines Kennworts aufgefordert zu werden . Ich weiß nicht, wie man erkennen kann, welcher Bildschirm angezeigt wird, aber das sollten wir für später aufheben ...

Um also den ersten (zufälligen) Benutzernamen auszuwählen und die Wahltaste-Return-Taste zu drücken, geben Sie einen bestimmten Benutzernamen ein, drücken Sie die Eingabetaste und geben Sie das Passwort ein:

sudo osascript -e 'tell app "Systemereignisse"
  Schlüsselcode 125
  Tastatureingabe mit der Option nach unten
  Tastendruck "der Benutzername"
  Verzögerung 1.0
  Tastatureingabe zurück
  Verzögerung 1.0
  Tastendruck "das Passwort"
  Verzögerung 1.0
  Tastatureingabe zurück
Ende erzählen '

Das obige zeigt einen Fehler, der, soweit ich das beurteilen kann, die Nutzung nicht einschränkt:

osascript [285]: 3891612: (connectAndCheck) Nicht vertrauenswürdige Apps sind dies nicht 
    darf vor der Anmeldung eine Verbindung zu Windows Server herstellen oder Windows Server starten.
_RegisterApplication (), FAILED TO stellt die Standardverbindung zu her
    Der WindowServer _CGSDefaultConnection () ist NULL.

Verwenden Sie alternativ das sprachspezifische Skript aus " Anmeldefenster über Apple Remote Desktop skripten " (möglicherweise zeigen die Kommentare auf dieser Site eines Tages eine bessere Lösung):

Tell-Prozess "SecurityAgent"
  setze Wert von Textfeld 1 von Gruppe 1 von Fenster 1 auf "den Benutzernamen"
  setze Wert von Textfeld 2 von Gruppe 1 von Fenster 1 auf "das Passwort"
Ende erzählen
Klicken Sie auf die Schaltfläche "Anmelden" in Fenster 1 des Anwendungsprozesses "SecurityAgent".

Das Hauptproblem ist jedoch, dass das Kennwort weiterhin benötigt wird . Allerdings: Offensichtlich wird kein Passwort benötigt, wenn ein Benutzer ein leeres Passwort hat. Bei leeren Passwörtern genügt ein einfaches Klicken auf das Symbol eines Benutzers. Wenn das Senden von Tastenanschlägen mit AppleScript akzeptabel ist, müssen Sie möglicherweise "alles" herausfinden:

  • Ist es möglich, das Kennwort eines Benutzers vorübergehend auszublenden, um das Starten (oder Fortsetzen) der Sitzung zu ermöglichen, ohne dieses Kennwort zu kennen ...?

  • Kann man das AppleScript fehlerfrei machen? Mögen:

    • Wie kann ich feststellen, ob das Anmeldefenster sichtbar ist? ( stat -f%Su /dev/consoleKann vielleicht helfen, da sich das ergibt,root während das Anmeldefenster angezeigt wird)
    • Wie kann ich feststellen, welches Anmeldefenster angezeigt wird? (Zum Beispiel: eines mit Symbolen und Anmeldenamen oder einer Dropdown-Liste oder nur einer Passwortabfrage, wenn jemand ausgewählt hat, zu einem bestimmten Benutzer zu wechseln?)
    • Werde die Verzögerungen los.
    • Was ist mit dieser Fehlermeldung?

(Ein Hinweis zum Testen: Bei Verwendung der Bildschirmfreigabe scheint das Festlegen der Einstellung Bei der Steuerung von Computern: Kennwörter und Tastenanschläge verschlüsseln behält die Verbindung auch dann bei, wenn das Anmeldefenster angezeigt wird oder wenn sich ein Benutzer erfolgreich angemeldet hat. Bei Verwendung der Option Alle Netzwerke verschlüsseln Daten, dann muss mein Mac die Bildschirmfreigabeverbindung jedes Mal wiederherstellen, wenn ein Login angezeigt oder ein Benutzer gewechselt wird.)


Dies ist ein guter Anfang, hat aber zwei Probleme. Erstens funktioniert es nicht, wenn Sie sich im Anmeldefenster befinden, was ich wollte, und es fragt nach einem Passwort, was ich lieber nicht möchte. Da es sich um root handelt, sollte es in der Lage sein, Benutzer ohne das Kennwort zu wechseln.
Sophie Alpert

Aha. Ich weiß nicht einmal, wie ich mich als anderer Benutzer anmelden soll, wenn ich am Computer selbst sitze, also keine Zigarre für sudo osascript -e 'tell app "System Events" to keystroke "password" & return'. Wenn der Bildschirm gesperrt ist, wird die Sitzung des anderen Benutzers fortgesetzt, wenn ein administrativer Benutzername und ein Kennwort eingegeben werden . Aber wie kann man eine Sitzung für einen Benutzer starten, ohne das Passwort zu kennen? (Nur um sicherzugehen, wenn Sie das Kennwort kennen: Eine andere Problemumgehung ist möglicherweise die Bildschirmfreigabe, die auch für den Anmeldebildschirm funktioniert. Sie müssen die Bildschirmfreigabe erneut herstellen, nachdem eine bestimmte Benutzersitzung gestartet oder fortgesetzt wurde.)
Arjan

Das ist gut. Ich würde jedoch eine Lösung vorziehen, bei der Tastatureingaben nicht manuell simuliert werden.
Sophie Alpert

2
Ich frage mich, ob jemand weiß, wie er eine Sitzung für jemand anderen beginnen kann. Ohne die obige Antwort zu berücksichtigen: Kann sich ein Administrator bei der täglichen Verwendung von Mac OS X als ein anderer Benutzer anmelden, ohne das Kennwort dieses Benutzers zu kennen? (Genau wie suauf der Eingabeaufforderung, aber dann für eine GUI - Sitzung Oder wie wenn der Bildschirm gesperrt ist, in dem ein administrativen Benutzername und Passwort. Wieder den anderen Sitzung des Benutzers.)
Arjan

Möglicherweise ist es nicht möglich, AppleScript-Tastenanschläge zu verwenden: docs.info.apple.com/article.html?path=RemoteDesktop/3.0/en/…
Sophie Alpert

1

Ich habe das kürzlich untersucht.

Fügen Sie dies in den PAM-Stack Ihrer App ein oder testen Sie es mit sshd:

session    required       pam_launchd.so launchd_session_type=Aqua

Dies trägt wesentlich dazu bei, dass Sie eine grafische Sitzung erhalten, die einer ausgelagerten Benutzersitzung ziemlich nahe kommt. Insbesondere befindet es sich im richtigen Bootstrap-Namespace und verfügt über die richtigen Bootstrap-Ports (glaube ich). Sie können in der Quelle nachsehen, was pam_launchd bewirkt. Es verwendet eine vernünftig aussehende private Bibliothek (vproc_priv.h-Funktionen in libvprop), um die Mach-Routinen zum Einrichten der Ports und des Namespace aufzurufen. Es passt zu allen (eingeschränkten) Dokumenten, die Apple für die von Mach abgeleiteten Systemaufrufe bereitstellt.

Als nächstes müssen Sie Ihre Audit-Benutzer-ID auf die des Benutzers mit der BSM-API einstellen, sonst wird das Anmeldefenster nicht mit Ihnen in Lion kommunizieren.

Die Sitzung ähnelt jetzt einer ausgeschalteten Sitzung, wenn Sie "launchctl blist" aktivieren und einige Prozesse und Dienste gut zum Leben erwecken (z. B. das Pasteboard usw.). Tatsächlich läuft alles außer Finder und Login-Fenster. Solange das Anmeldefenster nicht ausgeführt wird, können Sie keine grafische Anwendung starten, und der Anmeldefensterprozess pro Sitzung wird immer als direktes untergeordnetes Element des globalen Prozesses gestartet. Wie kann man den Anmeldefensterprozess anstoßen, um ein neues Anmeldefenster in der neuen Sitzung zu starten? Ich kann keinen Weg finden, um das letzte Stück in Position zu bringen!

Jede Hilfe zum Ausfüllen dieser Antwort dankbar erhalten.


0

Wenn Sie den Befehl mit sudo ausführen, können Sie festlegen, dass das Skript von Standardbenutzern nicht gelesen werden kann. Es ist nicht perfekt, aber wenn Ihr Administrator bereits gefährdet ist, ist das Spiel trotzdem vorbei!

chmod ur scriptname

Mein Skript sieht so aus, es funktioniert remote, wenn ein Benutzer bereits ausgeführt wird, und wechselt per SSH zu einem zweiten Benutzer (getestet auf 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

Ich musste denselben Benutzer an 25 verschiedenen Arbeitsstationen anmelden, um ein Software-Update durchzuführen. Ich konnte den Befehl 'osascript -e ...' in SSH-Sitzungen nicht zuverlässig ausführen, auch nicht mit Sudo-Berechtigungen. Ich konnte es jedoch über Apple Remote Desktop ausführen. Wenn Sie ARD haben:

  1. Wählen Sie Ihre Maschinen aus
  2. Wecken Sie sie auf und melden Sie sie bei Bedarf von anderen Benutzern ab
  3. Wählen Sie "UNIX-Befehl senden ..." aus dem Menü "Verwalten"
  4. Fügen Sie Arjans Skript (ohne das Wort 'sudo') in das Befehlsfenster ein
  5. Wählen Sie "Befehl ausführen als: Benutzer: root" aus und geben Sie ihn ein.

Ich war hocherfreut, alle 25 Mac Minis, auf denen Finder ausgeführt wird, innerhalb von weniger als einer Minute als Benutzer zu finden. Um es noch einmal zu wiederholen: Mit ARD müssen Sie nicht auf jedem Computer das sudo-Kennwort eingeben. Die Zeilen, die Sie in das Befehlsdialogfeld einfügen müssen, lauten (durch Ersetzen eines gültigen Benutzernamens und Kennworts):

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'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.