如何查找谁正在使用物理控制台?

我想使用一个脚本来找出当前在物理控制台上的用户的用户名(即键盘、鼠标和图形显示器的控制权所属者)。
我不仅仅想知道谁在运行X(因为当前控制台可以切换到另一个终端和另一个用户)。

澄清一下:
类似于wwho等命令可以显示谁登录在哪个终端。这很简单。然而,我想知道目前是谁拥有物理控制台(显示器、键盘等)。例如,如果两个用户运行的显示器分别是:0和:1,我可以通过按下ctrl+alt+7ctrl+alt+8在显示器之间切换,那么我想知道当前哪个用户与他或她的显示器以及实际的物理屏幕相连。


还有一个澄清:
我不想知道自己的用户名。我有一个脚本,以另一个用户或root身份运行,需要知道谁在使用物理显示器。可能会有几个由不同用户运行的X会话,其中一些是虚拟化的,一些连接到远程X服务器,但我只对实际在监视器上显示输出的那个感兴趣。


又一个澄清: 无论是什么命令,在按下Ctrl+Alt+F1(切换到另一个虚拟控制台)后,输出必须不同。

这是一个自问自答吗? - jokerdino
不好意思,很遗憾。 - January
4个回答

很抱歉,我无法给你一个具体的答案(因为我对技术不太了解),但我相信你可以通过使用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

然后,根据您的应用程序,您将希望检查返回对象的属性,这些属性应该是指向会话的对象路径。

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这绝对是我正在寻找的答案。非常感谢你! - January

[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天没有使用系统了。与此相反,来自blackbeauty的登录显示0.00的空闲时间,这表示它当前正在使用中。

不,这只是告诉我 - 如你所写 - 是谁登录到了哪个 终端。如果要用于脚本,我想知道的是谁拥有物理控制台(键盘、显示屏等)。 - January
顺便提一句,闲置时间也没什么信息;我正在处理一个屏幕保护程序的脚本,但我想知道哪个用户正在运行实际显示出来的屏幕保护程序。 - January
TTY和“什么”可能适用于这里,您只需要提取必要的部分。 - Journeyman Geek
嗯,不行,因为它可以在任何地方运行(后台、另一个X服务器、虚拟机中)。 - January

有很多种方法:
  • whoami
  • w
  • echo $USER
  • logname

另一个命令是
whoami

显示当前登录的用户名