ルートとして、どのユーザーが X ディスプレイ :0 を所有しているかを判断する方法 (デフォルトの Fedora 18 システムの場合)
説明:どのユーザーが :0 に接続するための本来の権限を持ち、他のユーザーに接続権限を与えるかを知りたいです。以下の現在の回答によると、X プロセスは root が所有しているようですが、それを起動したユーザーが権限を持っている可能性があります。
答え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
ログインctlsystemd が救世主となる:
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
logind 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
GDM を搭載した Ubuntu 18.04 で動作する 1 つの例 (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 または同様のユーザーとして実行されます (シートの HW デバイスへのアクセスが許可されているため)。別のセッションでの使用を許可するには、ユーザー用の権限ファイルが作成されます。
私が見つけたもう一つの解決策はログインしたユーザーとその表示を識別する最善の方法は何ですか?(ただし、複数のユーザーが同じ 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
基本的に、ユーザーのすべてのプロセスの env を照会し、各ディスプレイごとにどのユーザーが属していたかを保存します。(私の VNC ディスプレイでも機能しました)。