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 -f
die 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.
su
oder sudo
kö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.
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:
kein Hang
screencapture
greift 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?Zhenzhen Zhan
screencapture
erfasst den Bildschirm des anderen Benutzers, wenn inlogin
, erfasst jedoch den aktuell sichtbaren Bildschirm insu -u
,sudo -u
, oderlogin -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.