Welchem ​​Benutzer gehört das X-Display?

Welchem ​​Benutzer gehört das X-Display?

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 Xwird 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 user001gestartet xinitund verwendet wird :0. Allerdings rootist der XProzess 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, x11und drucken Sie den Benutzernamen aus. Für Wayland ist der Typ waylandund für MIR ist mirgemäß 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).

verwandte Informationen