2013-10-14 3 views
4

Я ищу способ определения локального ввода (мышь/клавиатура) время простоя, удаленно через SSH, без корневого доступа или доступа к текущему пользователю XAUTHORITY ,Remote Linux Idle время локального пользователя

Я знаю следующее решение, которое работает, если у вас есть доступ к X серверу: detecting keyboard, mouse activity in linux

Но возможно без подключения к серверу X? Есть ли другой способ? Например. косвенно через использование процессором или памятью определенных процессов? Любые идеи приветствуются.

ответ

7

Использование решений w и/dev позволит вам до сих пор, так как может быть, что пользователь находится рядом, но ничего не набрал в оболочке - например, он/она может играть в какую-то игру. Лучшим подходом будет опрос/proc/interrupts. Локальные прерывания для мыши и клавиатуры часто находятся под «i8042» (хотя в некоторых редких случаях это может быть иначе). Возможно, вы захотите попробовать: «grep i8042/proc/interrupts». Это даст IRQ 1 (клавиатура) и IRQ 12 (обычно, мышь). Вы можете получить значения, сохранить их, а затем опросить время от времени (без обратного вызова, увы), чтобы получить подсчеты. Если числа были изменены, произошли прерывания - это означало, что клавиатура (IRQ 1) или мышь (IRQ 12) были затронуты/нажаты и т. Д. Нажатия клавиш обычно генерируют два прерывания (клавиша вниз, клавиша вверх). Движение мыши более неустойчивое.

Это имеет ряд преимуществ:

1) Если пользователь так много, как касается мыши, или нажимает клавишу - вы знаете 2) Вы можете сделать это программно (т.е. FOPEN()/Proc/прерывания, или (альтернативно)/proc/stat, и получить строку «intr») и fread() соответствующие строки 3) Для этого вам даже не нужно быть root.

+0

Это классно. Хотя кажется, что он не работает с USB-клавиатурой/мышью? –

+0

Я только что проверил, есть также прерывания USB. Однако они происходят на регулярной основе. Поэтому я могу вычесть этот показатель, чтобы увидеть, есть ли дополнительные события. Это должно сработать. –

+0

Не работает с USB, правильно, но USB по-прежнему является источником прерываний. Так да. Корреляция может быть не 1: 1, как у i8042, но - все равно - вы получите ненулевое значение, когда пользователь активен - именно это вы хотели в первую очередь. – Technologeeks

1

Как непривилегированный, отличный пользователь, я попытаюсь сделать это, отслеживая новые процессы, порожденные целевым идентификатором пользователя. Если вы видите новый процесс, скорее всего, это означает, что пользователь вызвал его появление, если его родительский cron (или один из нескольких подобных супервизоров, вам придется попробовать его в своей системе и отфильтровать несколько ложных сигналы тревоги, которые вы получаете вначале).

Это не даст вам очень точное время простоя, но, возможно, максимальную границу. Если вы хотите что-то более точное, вы, вероятно, должны обладать привилегиями для этого.

+0

Пользователь может быть активным (что-то писать в редакторе) без создания новых процессов –

1

Команды w и ls -l /dev/pts являются лучшими, о которых я могу думать. Между ними вы можете получить довольно хороший вид бездействия на консолях linux, ssh и xterm.

Если пользователь просто сидит на месте, играя с firefox или что-то в этом роде, это не поймает его, но я не уверен, что вы можете получить это без доступа к X или быть root. Поиск использования процессора не является надежным, потому что многие приложения используют небольшой процессор даже в режиме ожидания или практически равны нулю при использовании, а просмотр/proc/x_server_pid/* тоже не помогает, поскольку X все еще может работать, даже если пользователь не работает.

Ищете новые процессы, как и другой ответ, это лучшее, что я могу придумать, если/dev/pts не помогает, и вы не можете на самом деле смотреть на вход.

Смежные вопросы