How to find out who is using the physical console?
I would like to use a script to find out the username - of the user who is currently on the physical console (who has command of the keyboard, mouse and graphical display)?
I do not just want to know who runs X (as the current console can be switched to another terminal and another user).
To clarify:
Commands like w
, who
etc. show who is logged at which terminal. This is simple. I would like to know, however, who owns currently the physical console (display, keyboard etc.). For example, if two users run displays :0 and :1, and I can switch between the displays with ctrl+alt+7 and ctrl+alt+8, I would like to know which user currently has the connection between his or her display and the actual, physical screen.
One more clarification:
I am not interested in knowing my own username. I have a script, running as another user or root, that needs to know who uses the physical display. There can be several X sessions running by different users, some of them virtualized, some of them connected to a remote X server, but I am only interested in the one that is actually displaying output on the monitor.
Yet another clarification:
Whatever the command is, the output must be different after pressing Ctrl+Alt+F1 (switching to another virtual console).
Solution 1:
I'm afraid I can't give you a specific answer (because I don't know the tech well), but I believe you can find it out using D-Bus and ConsoleKit.
For example, when I switch from X to a VT and back, I get this listening on 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"
Specifically, you could use the GetActiveSession method. Here's how with dbus-send
(may require sudo
):
$ dbus-send --system --type=method_call --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Seat1 org.freedesktop.ConsoleKit.Seat.GetActiveSession
Then, depending on your application, you'll want to check out the returned object's properties, which should be an object path to a Session.
Solution 2:
[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 ~]$
You can use the w command to see who is logged on. The idle time and what should tell you what is being run - in this case gdm indicates an active log in, and the idle time indicates the user has not been at the system in 2 days. Contrast this with the login from blackbeauty, which has a 0.00 idle time, which indicates its currently in use.
Solution 3:
There are many ways:
whoami
w
echo $USER
logname