Es folgen weitere Fragen, die ich zu wissen glaube:
Aus einer Nicht-X-Sitzung? (Das bedeutet, dass root nicht bei X angemeldet ist.)
Wenn mehrere Personen bei X angemeldet waren, kann ich dann automatisch erkennen, wer sich auf welchem Bildschirm befand, und so programmgesteuert ermitteln, auf welchem Bildschirm die App gestartet werden muss?
Kann ich die App als Benutzer starten? (Ok, ich bin mir zu 99,999% sicher, dass dies ein Ja ist.)
Kann ich feststellen, ob Benutzer der Gruppe X bei X angemeldet sind?
naga_plugged.pl
Skript beendet wird (oder in den Hintergrund tritt), daudev
es darauf wartet, dass es beendet wird.Antworten:
Um ein grafisches Programm auf dem Desktop eines Benutzers zu starten, müssen Sie zwei Dinge feststellen: Auf welcher Anzeige befindet sich der Desktop des Benutzers (die Adresse) und welches Berechtigungs-Cookie (das Kennwort) verwendet werden soll.
Der folgende Befehl sollte die lokalen Anzeigen auflisten, bei denen der Benutzer auf den meisten Geräten angemeldet ist (eine pro Zeile):
Das Finden des Autorisierungscookies ist etwas schwieriger. Sie müssen nach der Cookie-Datei des Benutzers suchen, die
~/.Xauthority
standardmäßig festgelegt ist (alles, was Sie benötigen, ist der Speicherort der Cookie-Datei, Sie müssen das Cookie nicht daraus extrahieren). Das funktioniert auf vielen Systemen, aber nicht allen. Das hängt vom Display-Manager und seiner Einrichtung ab. Insbesondere hat Gdm (der Standard unter Ubuntu) nicht den Standardspeicherort verwendet, den ich zuletzt verwendet habe. Ich kann mir keine tragbare Methode vorstellen, um die eigentliche X-Cookie-Datei herauszufinden. Der genaueste Weg, dies herauszufinden, besteht darin, die PID des X-Prozesses herauszufinden und nach dem Argument für die-auth
Option zu suchen . Eine andere Möglichkeit besteht darin, einen Prozess zu finden, der auf diesem X-Server ausgeführt wird, und dessenXAUTHORITY
Umgebungsvariable abzurufen. Wenn Sie Probleme haben, die Cookie-Datei zu finden, lesen SieÖffnen Sie ein Fenster auf einer Remote-X-Anzeige (warum "Anzeige kann nicht geöffnet werden")?Sobald Sie über beide Informationen verfügen, fügen Sie die ausgewählte Anzeige in die
DISPLAY
Umgebungsvariable und die ausgewählte X-Authority-Cookie-Datei in dieXAUTHORITY
Umgebungsvariable ein. Es spielt keine Rolle, unter welchem Benutzer das Programm ausgeführt wird. Kombinieren Sie mit,su
wenn Sie möchten.quelle
ps
oderhtop
oder…pids=$(pgrep -u $target_user nautilus)
bekommt also die PID, und wo muss ich eine-auth
Option setzen?-auth
nirgendwo eine Option ein. Möglicherweise müssen Sie in der Befehlszeile des X-Server-Prozesses danach suchen, um herauszufinden, was in dieXAUTHORITY
Umgebungsvariable eingefügt werden soll. Wenn Sie den Prozess eines Kunden haben, geht es bei Ihrem Bedarf nicht um etwas anderes als um-auth
den Wert derXAUTHORITY
Variablen dieses Kunden . Ich verstehe nicht, was du versuchst zu tun. Möglicherweise möchten Sie eine neue Frage stellen.Ich kann dies nicht vollständig versuchen, da auf allen meinen Rechnern root deaktiviert ist.
Mit dem
who
Befehl können Sie ermitteln, auf welcher Anzeige sich ein Benutzer befindet . Die letzte Spalte der Ausgabe ist normalerweise das DISPLAY, an dem der Benutzer angemeldet ist. So etwas könnte verwendet werden, um nur das Display zu erfassen (es gibt wahrscheinlich eine weitaus effizientere Methode, zögern Sie nicht, Änderungen anzubieten):Dann, um einen grafischen X-Befehl auf dieser Anzeige zu starten:
Dabei wird 0 durch die Anzeige ersetzt, die Sie im ersten Befehl gefunden haben, und Firefox wird durch den Befehl ersetzt, den Sie ausführen möchten. Sie können dies in ein Shell-Skript einfügen und einfach eine Variable verwenden.
Der nächste Teil ist der Teil, den ich noch nicht getestet habe, aber ich verstehe nicht, warum dies nicht möglich sein sollte:
um den X-Befehl als dieser Benutzer zu starten.
quelle
sudo -i
und konnte nicht sicher sein, ob die Ergebnisse davon abweichen würden, wenn ich mich direkt als root angemeldet hätte. :-)who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$
scheint zu funktionieren ...Sie könnten sehen, wie acpid es macht. ZB wenn es xscreensaver Befehle ausgibt oder den Bildschirm für jeden Benutzer, der X oder X-session ausführt, leer macht.
Zum Beispiel enthält diese Datei unter Ubuntu verwandte Sachen:
Enthält diese Schleife:
quelle
/usr/share/acpi-support/power-funcs
. Es ruftfgconsole
auf, um das aktive Linux vt zu finden, sucht dann nach einem X-Server, der auf dieser Konsole angezeigt wird, und findet den Benutzer von dort aus heraus. Dann wird es~/.Xauthority
als X-Cookie verwendet, was bedeutet, dass es keine Verbindung zum X-Server herstellen kann, sofern nichts fehlt (Ubuntus Standard-Setup mit gdm speichert die X-Cookies nicht im Haus des Benutzers) Verzeichnis).getXuser: command not found
Eine Erweiterung von Gilles Antwort ist, wie man die Cookie-Datei findet. Möglicherweise können Sie nach dem Festlegen der
DISPLAY
Umgebungsvariablen (wie von Gilles beschrieben)strace
den Dateizugriff suchenxhost
. Ich kann mir so etwas in BASH vorstellen:Die Ausgabe des obigen Codes sieht folgendermaßen aus:
Wie Sie deutlich sehen können, wird die Cookie-Datei direkt hier angezeigt.
quelle
Bei meiner Suche nach einer eleganten Methode zum Anzeigen von GUI- oder X-Aufgaben in einer eingeschränkten Umgebung, z. B. mit udev-Regeln oder vom Superuser, habe ich kürzlich ein dazu passendes Tool erstellt ( für weitere Details ).
xpub
ist ein Shell-Skript zum Abrufen der Variablen der X-Anzeigeumgebung in Bezug auf das aktuelle oder ein bestimmtes TTY.Dies ist ein Beispiel mit einer udev-Regel:
$env{ENV}
: Wenn der aktuelle Benutzer X startet, entfernen Sie es andernfalls.Das Prinzip ist dasselbe für eine Befehlszeile mit
export
:quelle