作为 root,如何确定哪个用户拥有 X display :0? (在具有默认值的 Fedora 18 系统上)
澄清:我想知道哪个用户具有连接到 :0 的原始权限并授予其他用户连接权限。根据下面的当前答案,root 似乎拥有 X 进程,但启动它的用户可能拥有权限。
答案1
ps -ef|grep X
会给你信息。
例如,在我的电脑上:
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
在这里,我们可以看到user001
启动xinit
并使用了显示:0
。然而,root
是进程的所有者X
。
在大多数安装中,用户不使用该xinit
命令(或startx
内部调用xinit
)。 X 服务器在启动过程中由 root 启动。在这种情况下,root 是显示器的“所有者”。
答案2
登录控制从 systemd 到救援:
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
获取会话 ID 列表,查看属于哪一个类型x11
并打印用户名。对于 Wayland 来说,类型是wayland
,对于 MIR 来说,类型是mir
根据 登录 D-Bus API 文档。
互动使用:
[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
答案3
这是确切的命令:
ps ho user $(pgrep X)
答案4
一个在 Ubuntu 18.04 上使用 GDM 运行的示例(没有尝试 lightdm)。因此,对于这种情况,它确实回答了这些问题。只是如果有人想再次删除答案......(如何找到显示器的用户)。
对于 Ubuntu 18.04 上的 GDM
loginctl show-session 2 -p Display
Display=
尽管正在使用显示器的会话,但仍会打印。不过,下面的解决方案有效。
~$ 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)
或者
~$ 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
正如您所说,由于 Xserver 是由 DM 启动的,它将作为 root 或类似用户运行(因为它被允许访问席位的硬件设备)。为了允许另一个会话使用为该用户创建的权限文件。
我找到的另一个解决方案识别登录用户及其显示的最佳方法?(但我认为,一旦多个用户在同一个 X 显示器上运行,就会失败)是:
#!/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
它基本上查询用户所有进程的环境并保存用户所属的每个显示。 (也适用于我的 VNC 显示)。