Wie kann ich als Root feststellen, welchem Benutzer das X-Display :0 gehört? (auf einem Fedora 18-System mit Standardeinstellungen)
Klärung:Ich möchte wissen, welcher Benutzer die ursprünglichen Berechtigungen zum Herstellen einer Verbindung mit :0 hat und anderen Benutzern die Berechtigung zum Herstellen einer Verbindung erteilen kann. Laut den aktuellen Antworten unten scheint root Eigentümer des X-Prozesses zu sein, aber der Benutzer, der ihn gestartet hat, hat möglicherweise Berechtigungen.
Antwort1
ps -ef|grep X
wird Ihnen die Informationen geben.
Auf meinem Computer beispielsweise:
user001 2721 2705 0 02:35 tty1 00:00:00 xinit /home/user001/.xinitrc -- /etc/X11/xinit/xserverrc :0 -auth /home/user001/.serverauth.2705
root 2722 2721 13 02:35 tty7 00:10:10 /usr/bin/X -nolisten tcp :0 -auth /home/user001/.serverauth.2705
user001 3475 3462 0 03:51 pts/0 00:00:00 grep X
Hier können wir sehen, dass user001
gestartet xinit
und verwendet wird :0
. Allerdings root
ist der X
Prozess Eigentümer.
Bei den meisten Installationen verwenden Benutzer den Befehl nicht xinit
(oder startx
der intern aufruft xinit
). Der X-Server wird während des Bootvorgangs von root gestartet. In diesem Fall ist root der „Besitzer“ der Anzeige.
Antwort2
Anmeldenvon systemd zur Rettung:
loginctl --no-legend list-sessions \
| cut -d ' ' -f 1 \
| while read sessionid; do \
[ $(loginctl --property Type --value show-session $sessionid) = 'x11' ] \
&& loginctl --property Name --value show-session $sessionid; \
done
Holen Sie sich die Liste der Sitzungs-IDs, sehen Sie, welche vom Typ ist, x11
und drucken Sie den Benutzernamen aus. Für Wayland ist der Typ wayland
und für MIR ist mir
gemäß der logind D-Bus API-Dokumentation.
Interaktive Nutzung:
[ciupicri@titan /]$ loginctl list-sessions
SESSION UID USER SEAT TTY
2 5000 ciupicri seat0
4 6000 somebody
9 6000 somebody
3 sessions listed.
[ciupicri@titan /]$ loginctl show-session 2
Id=2
User=5000
Name=ciupicri
Timestamp=Thu 2019-09-12 16:24:12 EEST
TimestampMonotonic=46881112
VTNr=1
Seat=seat0
Display=:0
Remote=no
Service=lightdm-autologin
Desktop=xfce
Scope=session-2.scope
Leader=2072
Audit=2
Type=x11
Class=user
Active=yes
State=active
IdleHint=no
IdleSinceHint=0
IdleSinceHintMonotonic=0
LockedHint=no
Antwort3
Dies ist der genaue Befehl:
ps ho user $(pgrep X)
Antwort4
Ein Beispiel, das unter Ubuntu 18.04 mit GDM funktioniert (habe Lightdm nicht ausprobiert). Für dieses Szenario beantwortet es also diese Frage. Nur falls jemand die Antwort wieder löschen möchte … (wie man Benutzer eines Displays findet).
Für GDM unter Ubuntu 18.04
loginctl show-session 2 -p Display
wird gedruckt Display=
, obwohl die Sitzung das Display verwendet. Die folgenden Lösungen haben jedoch funktioniert.
~$ who
user :1 2020-03-02 07:28 (:1)
user tty3 2020-03-03 09:39
user pts/1 2020-03-03 10:19 (some IP)
oder
~$ w
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user tty7 :0 15:12 1:48m 1:50 0.23s /usr/lib/gnome-
user pts/2 SomeIP 16:58 1:39 0.04s 0.04s -bash
Wie Sie sagten, wird der Xserver, da er vom DM gestartet wird, als Root oder ähnlicher Benutzer ausgeführt (da er auf die HW-Geräte des Sitzes zugreifen darf). Um einer anderen Sitzung die Verwendung zu ermöglichen, wird für den Benutzer eine Berechtigungsdatei erstellt.
Eine andere Lösung fand ich aufBeste Möglichkeit, angemeldete Benutzer und ihr DISPLAY zu identifizieren?(wird aber fehlschlagen, sobald mehrere Benutzer dasselbe X-Display verwenden, glaube ich) lautet:
#!/bin/bash
declare -A disps usrs
usrs=()
disps=()
for i in $(users);do
[[ $i = root ]] && continue
usrs[$i]=1
done # unique names
#Use .*DISPLAY=(\w*:[0-9.]+).* if you want to see DISPLAY of form :0.1
#or localhost:10.0 too
for u in "${!usrs[@]}"; do
for i in $(sudo ps e -u "$u" | sed -rn 's/.* DISPLAY=(:[0-9]*).*/\1/p');do
disps[$i]=$u
done
done
for d in "${!disps[@]}";do
echo "User: ${disps[$d]}, Display: $d"
done
Es fragt grundsätzlich die Umgebung aller Prozesse eines Benutzers ab und speichert für jedes Display, welcher Benutzer dazu gehörte. (Hat auch bei meinen VNC-Displays funktioniert).