Como descobrir quem está usando o console físico?

10

Eu gostaria de usar um script para descobrir o nome de usuário - do usuário que está atualmente no console físico (que possui o comando do teclado, mouse e tela gráfica)?

Não quero apenas saber quem executa o X (já que o console atual pode ser alternado para outro terminal e outro usuário).


Para esclarecer:
Comandos como w, whoetc. mostram quem está conectado em qual terminal. Isto é simples. Gostaria de saber, no entanto, quem possui atualmente o console físico (tela, teclado etc.). Por exemplo, se dois usuários executam exibições: 0 e: 1, e eu posso alternar entre as exibições com ctrl+ alt+ 7e ctrl+ alt+ 8, gostaria de saber qual usuário atualmente tem a conexão entre a exibição e a tela física real .


Mais um esclarecimento:
não estou interessado em saber meu próprio nome de usuário. Eu tenho um script, executando como outro usuário ou raiz, que precisa saber quem usa a exibição física . Pode haver várias sessões X em execução por usuários diferentes, algumas virtualizadas, algumas conectadas a um servidor X remoto, mas estou interessado apenas na que está exibindo a saída no monitor.


Mais um esclarecimento:
seja qual for o comando, a saída deve ser diferente após pressionar Ctrl+ Alt+ F1(alternar para outro console virtual).

janeiro
fonte
Esta é uma pergunta e resposta?
jokerdino
Infelizmente não.
janeiro

Respostas:

6

Receio não poder dar uma resposta específica (porque não conheço bem a tecnologia), mas acredito que você pode descobrir isso usando o D-Bus e o ConsoleKit.

Por exemplo, quando mudo de X para um VT e volto, ouço isso 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"

Especificamente, você pode usar o método GetActiveSession . Veja como com dbus-send(pode exigir sudo):

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

Então, dependendo do seu aplicativo, você deverá verificar as propriedades do objeto retornado, que deve ser o caminho do objeto para uma Sessão .

nfirvine
fonte
3
Muito útil, eu acho. Quando troco de sessão, a resposta muda de maneira correspondente. Em particular, eu poderia inserir o seguinte comando: dbus-send --system --type=method_call --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Session2 org.freedesktop.ConsoleKit.Session.GetUserque responde com o ID do usuário atual. A partir daí, a função da biblioteca getpwuid pode obter o nome de usuário.
John S Gruber
1
Esta é definitivamente a resposta que eu estava procurando. Muito obrigado!
janeiro
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 ~]$

Você pode usar o comando w para ver quem está conectado. O tempo ocioso e o que deve dizer o que está sendo executado - nesse caso, o gdm indica um logon ativo e o tempo ocioso indica que o usuário não está no sistema há 2 dias. Compare isso com o login do blackbeauty, que possui um tempo de inatividade de 0,00, indicando o uso em uso no momento.

Journeyman Geek
fonte
Não, isso só me diz - como você escreveu - quem está logado em qual terminal . Para usar com um script, eu gostaria de saber qual usuário é o proprietário do console físico (teclado, tela etc.)
janeiro
O tempo ocioso do PS também não é informativo; Estou trabalhando em um script que mexe com um protetor de tela, mas quero saber qual usuário está executando o protetor de tela que é realmente exibido .
janeiro
o TTY e 'o que' podem funcionar aqui, você só precisa extrair os bits necessários.
Journeyman Geek
Hum, não, porque ele pode ser executado sempre que (no fundo, em outro servidor X, em uma máquina virtual)
janeiro
1

Existem muitos caminhos:

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

Outro comando é

whoami

Mostra o nome de usuário atual do logeed

Ketan Patel
fonte