物理コンソールを使用しているユーザーを見つける方法は?


10

スクリプトを使用して、現在物理コンソールにいるユーザー(キーボード、マウス、およびグラフィックディスプレイのコマンドを持っているユーザー)のユーザー名を見つけたいですか?

Xを実行しているユーザーを知りたいだけではありません(現在のコンソールを別の端末と別のユーザーに切り替えることができるため)。


明確にするために:などの
コマンドはwwho誰がどの端末にログインしているかを示します。これは簡単です。ただし、物理コンソール(ディスプレイ、キーボードなど)を現在所有しているのは誰ですか。たとえば、2人のユーザーがディスプレイ:0と:1を実行していて、ctrl+ alt+ 7ctrl+ alt+ 8でディスプレイを切り替えることができる場合、現在どのユーザーが自分のディスプレイと実際の物理画面との間に接続を持っているかを知りたい。


もう一つの明確化:
私は自分のユーザー名を知ること興味がありません。物理ディスプレイを使用しているユーザーを知る必要があるスクリプトを、別のユーザーまたはrootとして実行しています。異なるユーザーが実行しているいくつかのXセッションがあり、一部は仮想化され、一部はリモートXサーバーに接続されていますが、私が関心を持っているのは、実際に出力をモニターに表示しているセッションのみです。


さらに別の説明:
コマンドが何であれ、Ctrl+ Alt+ F1(別の仮想コンソールに切り替え)を押した後の出力は異なる必要があります。


これは自己Q&Aですか?
jokerdino

いいえ、残念ながら。

回答:


6

特定の答えを提供することはできませんが(私は技術をよく知らないため)、D-BusとConsoleKitを使用してそれを見つけることができると思います。

たとえば、XからVTに切り替えて戻すと、次のようにリッスンしdbus-monitorます。

$ dbus-monitor --system | grep ConsoleKit
signal sender=:1.16 -> dest=(null destination) serial=19039 path=/org/freedesktop/ConsoleKit/Session2; interface=org.freedesktop.ConsoleKit.Session; member=ActiveChanged
signal sender=:1.16 -> dest=(null destination) serial=19040 path=/org/freedesktop/ConsoleKit/Seat1; interface=org.freedesktop.ConsoleKit.Seat; member=ActiveSessionChanged
signal sender=:1.16 -> dest=(null destination) serial=19041 path=/org/freedesktop/ConsoleKit/Session2; interface=org.freedesktop.ConsoleKit.Session; member=ActiveChanged
signal sender=:1.16 -> dest=(null destination) serial=19042 path=/org/freedesktop/ConsoleKit/Seat1; interface=org.freedesktop.ConsoleKit.Seat; member=ActiveSessionChanged
   string "/org/freedesktop/ConsoleKit/Session2"

具体的には、GetActiveSessionメソッドを使用できます。これがdbus-send(必要な場合がありますsudo)の方法です。

$ dbus-send --system --type=method_call --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Seat1 org.freedesktop.ConsoleKit.Seat.GetActiveSession

次に、アプリケーションに応じて、返されたオブジェクトのプロパティをチェックアウトします。これは、Sessionへのオブジェクトパスである必要があります。


3
とても役に立ったと思います。セッションを切り替えると、それに応じて応答が切り替わります。特にdbus-send --system --type=method_call --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Session2 org.freedesktop.ConsoleKit.Session.GetUser、現在のユーザーIDで応答する次のコマンドを入力できます。そこから、ライブラリ関数getpwuidがユーザー名を取得できます。
John S Gruber

1
これは間違いなく私が探していた答えです。どうもありがとうございました!

5
[geek@atremis ~]$ w

 20:02:02 up 2 days,  8:37,  3 users,  load average: 0.00, 0.01, 0.00

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

geek     tty1     :0               Thu11    2days 35.11s  0.18s pam: gdm-passwo

geek     pts/0    athena           Fri22   21:04m  0.03s  0.03s -bash

geek     pts/1    blackbeauty      20:02    0.00s  0.14s  0.10s w

[geek@atremis ~]$

wコマンドを使用して、ログオンしているユーザーを確認できます。アイドル時間と何が実行されているかを示す内容-この場合、gdmはアクティブなログインを示し、アイドル時間はユーザーが2日間システムにいないことを示します。これを、現在使用されていることを示す0.00のアイドル時間を持つblackbeautyからのログインと比較してください。


いいえ、これは、あなたが書いたように、誰がどの端末にログインしているかを知るだけです。スクリプトで使用するために、物理コンソール(キーボード、ディスプレイなど)を所有しているユーザーを知りたい
1月

PSアイドル時間も情報を提供しません。スクリーンセーバーをいじるスクリプトの作業をしていますが、実際に表示されているスクリーンセーバー実行しているユーザーを知りたいのですが。

ここでTTYと「何が」機能する場合、必要なビットを抽出するだけで済みます。
ジャーニーマンオタク

ええと、いいえ、どこでも(バックグラウンド、別のXサーバー、仮想マシン)で実行できるため
1


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.