¿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).

enero
fuente
¿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 .

nfirvine
fuente
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.

Journeyman Geek
fuente
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
1

Hay muchas maneras:

  • whoami
  • w
  • echo $USER
  • logname
hytromo
fuente
0

Otro comando es

whoami

Muestra el nombre de usuario actual logeed

Ketan Patel
fuente