![Qual usuário possui o display X?](https://rvso.com/image/31636/Qual%20usu%C3%A1rio%20possui%20o%20display%20X%3F.png)
Como determinar, como root, qual usuário possui o display X: 0? (em um sistema Fedora 18 com padrões)
Esclarecimento:Quero saber qual usuário tem permissões originais para se conectar: 0 e conceder permissão a outros usuários para se conectar. De acordo com as respostas atuais abaixo, parece que o root possui o processo X, mas o usuário que o iniciou pode ter permissões.
Responder1
ps -ef|grep X
lhe dará as informações.
Por exemplo, no meu computador:
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
Aqui podemos ver que user001
lançou xinit
e usa o display :0
. Porém, root
é o dono do X
processo.
Na maioria das instalações, os usuários não usam o xinit
comando (ou startx
o que chama internamente xinit
). O servidor X é iniciado pelo root durante o processo de inicialização. Nesse caso, root é o “proprietário” da exibição.
Responder2
loginctldo systemd para o resgate:
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
Obtenha a lista de IDs de sessão, veja qual é do tipo x11
e imprima o nome do usuário. Para Wayland o tipo é wayland
e para MIR está mir
de acordo com o Documentação da API D-Bus logind.
Uso interativo:
[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
Responder3
Este é o comando exato:
ps ho user $(pgrep X)
Responder4
Um exemplo que funciona no Ubuntu 18.04 com GDM (não tentei lightdm). Portanto, para este cenário, ele responde a essas perguntas. Só se alguém quiser deletar a resposta novamente.... (como encontrar usuários de um display).
Para GDM no Ubuntu 18.04
loginctl show-session 2 -p Display
será impresso Display=
enquanto estiver sendo a sessão usando o display. As soluções abaixo funcionaram.
~$ 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)
ou
~$ 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 você disse desde que o Xserver é iniciado pelo DM ele será executado como root ou usuário similar (já que é permitido acessar dispositivos HW do assento). Para permitir o uso de outra sessão, um arquivo de autoridade é criado para o usuário.
Outra solução que encontrei emMelhor maneira de identificar usuários logados e seus DISPLAY?(mas falhará assim que vários usuários executarem no mesmo monitor X, eu acho) é:
#!/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
Basicamente, ele consulta o ambiente de todos os processos de um usuário e salva para cada display qual usuário pertence a ele. (Funcionou também para meus monitores VNC).