¿Cómo saber quién está usando la consola física?


10

Me gustaría utilizar un script para averiguar el nombre de usuario del usuario que se encuentra actualmente en la consola física (que tiene el control del teclado, el mouse y la pantalla gráfica).

No solo quiero saber quién ejecuta X (ya que la consola actual se puede cambiar a otro terminal y a otro usuario).


Para aclarar: los
comandos como w, whoetc. muestran quién está conectado en qué terminal. Esto es simple. Sin embargo, me gustaría saber quién posee actualmente la consola física (pantalla, teclado, etc.). Por ejemplo, si dos usuarios ejecutan pantallas: 0 y: 1, y puedo cambiar entre las pantallas con ctrl+ alt+ 7y ctrl+ alt+ 8, me gustaría saber qué usuario tiene actualmente la conexión entre su pantalla y la pantalla física real .


Una aclaración más:
no estoy interesado en conocer mi propio nombre de usuario. Tengo un script, que se ejecuta como otro usuario o root, que necesita saber quién usa la pantalla física . Puede haber varias sesiones X ejecutadas por diferentes usuarios, algunas de ellas virtualizadas, algunas conectadas a un servidor X remoto, pero solo estoy interesado en la que realmente muestra la salida en el monitor.


Otra aclaración:
cualquiera que sea el comando, la salida debe ser diferente después de presionar Ctrl+ Alt+ F1(cambiar a otra consola virtual).


¿Es esto un auto Q&A?
jokerdino

No Desafortunadamente.
Enero

Respuestas:


6

Me temo que no puedo darle una respuesta específica (porque no conozco bien la tecnología), pero creo que puede encontrarla usando D-Bus y ConsoleKit.

Por ejemplo, cuando cambio de X a VT y viceversa, escucho esto 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"

Específicamente, puede usar el método GetActiveSession . He aquí cómo con dbus-send(puede requerir sudo):

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

Luego, dependiendo de su aplicación, querrá verificar las propiedades del objeto devuelto, que debería ser una ruta de objeto a una sesión .


3
Muy útil, creo. Cuando cambio de sesión, la respuesta cambia correspondientemente. En particular, podría ingresar el siguiente comando: dbus-send --system --type=method_call --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Session2 org.freedesktop.ConsoleKit.Session.GetUserque responde con el ID de usuario actual. Desde allí, la función de biblioteca getpwuid puede obtener el nombre de usuario.
John S Gruber el

1
Esta es definitivamente la respuesta que estaba buscando. ¡Muchas gracias!
Enero

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 ~]$

Puede usar el comando w para ver quién inició sesión. El tiempo de inactividad y lo que debería decirle qué se está ejecutando: en este caso, gdm indica un inicio de sesión activo, y el tiempo de inactividad indica que el usuario no ha estado en el sistema en 2 días. Compare esto con el inicio de sesión de blackbeauty, que tiene un tiempo de inactividad de 0.00, lo que indica que está actualmente en uso.


No, esto solo me dice, como usted escribió, quién inició sesión en qué terminal . Para usar con un script, me gustaría saber qué usuario posee la consola física (teclado, pantalla, etc.)
enero de enero

El tiempo de inactividad del PS tampoco es informativo; Estoy trabajando en un script que juega con un protector de pantalla, pero quiero saber qué usuario está ejecutando el protector de pantalla que realmente se muestra .
Enero

el TTY y 'qué' podría funcionar aquí, solo necesitaría extraer los bits necesarios.
Journeyman Geek

Um, no, porque puede ejecutarse donde sea (en segundo plano, en otro servidor X, en una máquina virtual)
enero


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.