Как узнать, кто использует физическую консоль?
Я хотел бы использовать скрипт, чтобы узнать имя пользователя - пользователя, который в настоящее время находится на физической консоли (у кого есть команда клавиатуры, мыши и графического дисплея)?
Я не просто хочу знать, кто запускает X (поскольку текущая консоль может быть переключена на другой терминал и другого пользователя).
Чтобы уточнить:
Команды как w
, who
и т.д. покажите кто на каком терминале залогинен. Это просто Я хотел бы знать, однако, кто в настоящее время владеет физической консолью (дисплей, клавиатура и т. Д.). Например, если два пользователя запускают дисплеи:0 и:1, и я могу переключаться между дисплеями с помощью ctrl+alt+7 и ctrl+alt+8, я хотел бы знать, какой пользователь в настоящее время имеет связь между его или ее дисплеем и фактический, физический экран.
Еще одно уточнение:
Мне не интересно знать мое собственное имя пользователя. У меня есть скрипт, работающий от имени другого пользователя или пользователя root, который должен знать, кто использует физический дисплей. Может быть несколько X-сессий, запущенных разными пользователями, некоторые из них виртуализированы, некоторые подключены к удаленному X-серверу, но меня интересует только тот, который фактически отображает вывод на мониторе.
Еще одно уточнение:
Какой бы ни была команда, результат должен быть другим после нажатия Ctrl+Alt+F1 (переключение на другую виртуальную консоль).
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
Затем, в зависимости от вашего приложения, вы захотите проверить свойства возвращаемого объекта, которые должны быть путем к объекту для сеанса.
[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, что указывает на его использование в настоящее время.
Другая команда
whoami
Показывает текущее имя пользователя logeed