¿Cómo determinar, como root, qué usuario posee la pantalla X: 0? (en un sistema Fedora 18 con valores predeterminados)
Aclaración:Quiero saber qué usuario tiene permisos originales para conectarse: 0 y otorgar permiso a otros usuarios para conectarse. Según las respuestas actuales a continuación, parece que root es propietario del proceso X, pero el usuario que lo inició puede tener permisos.
Respuesta1
ps -ef|grep X
te dara la informacion.
Por ejemplo, en mi computadora:
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
Aquí podemos ver que user001
se lanzó xinit
y usa la pantalla :0
. Sin embargo, root
es el dueño del X
proceso.
En la mayoría de las instalaciones, los usuarios no usan el xinit
comando (o startx
el cual llama internamente xinit
). El servidor X se inicia mediante root durante el proceso de inicio. En ese caso, root es el "propietario" de la pantalla.
Respuesta2
iniciar sesiónctlde systemd al rescate:
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
Obtenga la lista de ID de sesión, vea cuál es de tipo x11
e imprima el nombre de usuario. Para Wayland el tipo es wayland
y para MIR es mir
según el iniciar sesión Documentación de la API de D-Bus.
Uso interactivo:
[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
Respuesta3
Este es el comando exacto:
ps ho user $(pgrep X)
Respuesta4
Un ejemplo que funciona en Ubuntu 18.04 con GDM (no probé lightdm). Entonces, para este escenario, responde esas preguntas. Solo si alguien quiere borrar la respuesta nuevamente... (cómo encontrar usuarios de una pantalla).
Para GDM en Ubuntu 18.04
loginctl show-session 2 -p Display
Se imprimirá Display=
aunque esté la sesión utilizando la pantalla. Sin embargo, las soluciones a continuación funcionaron.
~$ 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)
o
~$ 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
Como usted dijo, dado que el DM inicia el Xserver, se ejecutará como usuario root o similar (ya que se le permite acceder a los dispositivos HW del asiento). Para permitir que otra sesión utilice un archivo de autoridad, se crea para el Usuario.
Otra solución que encontré en¿La mejor manera de identificar a los usuarios que han iniciado sesión y su PANTALLA?(pero creo que fallará tan pronto como varios usuarios se ejecuten en la misma pantalla X) es:
#!/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
Básicamente, consulta el entorno de todos los procesos de un usuario y guarda para cada pantalla qué usuario pertenecía a él. (También funcionó para mis pantallas VNC).