Wie verwende ich den Befehl „login“, um einen Screenshot vom Desktop eines anderen Benutzers zu machen?

Ich möchte nur wissen, ob dies in einem Befehl ohne Interaktionen in macOS möglich ist. Es gibt eine interaktive Möglichkeit, dies zu tun (ich habe zuerst zum Benutzer abc gewechselt und dann zurück gewechselt, sodass abc einen versteckten Desktop hatte):

(in sudo mode)
login abc
(type the password)
screencapture <png-file-name>

In meinem Test würde dies einen Screenshot des versteckten Desktops von abc machen und ihn in der Datei speichern. Aber das Seltsame ist, dass, wenn ich -fdie Option (nur im sudo-Modus anwendbar) verwende, um die Notwendigkeit der Passworteingabe zu beseitigen, der Screenshot zum Desktop des aktuellen Benutzers wird, nicht zum Desktop von abc:

(in sudo mode)
login -f abc /usr/sbin/screencapture <png-file-name>
OR
login -f abc bash -c "/usr/sbin/screencapture <png-file-name>"

Beides funktioniert nicht wie erwartet.

suoder sudokönnen meine Anforderungen auch nicht erfüllen, da sie auch die Screenshots des Desktops des aktuellen Benutzers machen.

Sie fragen sich vielleicht, warum ich das will. Eigentlich will ich keine Screenshots, ich will Sicherheit. Ich möchte die Shell dieses anderen Benutzers vollständig vom aktuellen Benutzer isolieren, sodass bösartiger Code, der in dieser Shell ausgeführt wird, keinen Screenshot des aktuellen Benutzers machen kann.

Bist du dir bei der ersten Annahme sicher? screencapturegreift auf den aktuell sichtbaren Bildschirm zu, unabhängig vom Benutzer, der über das Terminal angemeldet ist. Welches Problem versuchst du hier zu lösen? Können Sie es beschreiben, ohne bereits Vermutungen über die Lösung anzustellen?
Nicht Annahmen. Ich habe sie getestet. screencaptureerfasst den Bildschirm des anderen Benutzers, wenn in login, erfasst jedoch den aktuell sichtbaren Bildschirm in su -u, sudo -u, oder login -f. Aber zuerst müssen Sie sich mit der Benutzeroberfläche bei diesem Benutzer anmelden und dann zurückwechseln (nicht beenden), um seinen Desktop auszublenden. Ich habe die Beschreibung zur Verdeutlichung geändert.

Antworten (1)

Der Desktop wird vom WindowServer-Daemon verwaltet.

Die Kommunikation mit WindowServer wird geschützt, sodass nur root und der aktuelle Konsolenbenutzer auf WindowServer zugreifen können.

Da Sie sudo verwenden, haben Sie Root-Rechte, um mit WindowServer kommunizieren zu können.

Außerdem wird anhand des aktuellen Namensraums bestimmt, welcher Desktop "Ihr Desktop" ist. Für jeden aktuell angemeldeten Benutzer wird ein Sitzungsnamensraum erstellt.

Wenn Sie den Login-Befehl verwenden, werden Sie aufgefordert, Ihr Passwort einzugeben. Dies wird tatsächlich vom PAM-Subsystem gehandhabt. Als Teil der standardmäßigen PAM-Einrichtung auf macOS werden Sie zum richtigen (Ihrem eigenen) Sitzungsnamensraum weitergeleitet, wenn Sie sich mit dem richtigen Passwort anmelden.

Wenn Sie also "Login" verwenden und ein Passwort eingeben, erhalten Sie einen Screenshot des Desktops dieses Benutzers, da Sie sich im richtigen Namespace befinden.

Wenn Sie jedoch "login -f" verwenden, umgehen Sie PAM. Daher werden die PAM-Module nie ausgeführt und Sie bleiben im selben Namensraum wie zuvor.

Wenn Sie also den Screenshot mit "login -f" erstellen, erhalten Sie tatsächlich einen Screenshot des aktuell angemeldeten Benutzers - und nicht des gewünschten "abc"-Benutzers.

Mehr dazu können Sie in der Technical Note TN2083 nachlesen:

https://developer.apple.com/library/content/technotes/tn2083/_index.html#//apple_ref/doc/uid/DTS10003794-CH1-SUBSECTION14