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


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 .


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.


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

0

Outro comando é

whoami

Mostra o nome de usuário atual do logeed

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.