Jak dowiedzieć się, kto korzysta z fizycznej konsoli?

10

Chciałbym użyć skryptu, aby znaleźć nazwę użytkownika - użytkownika, który aktualnie znajduje się na fizycznej konsoli (kto ma klawiaturę, mysz i wyświetlacz graficzny)?

Nie chcę tylko wiedzieć, kto uruchamia X (ponieważ bieżącą konsolę można przełączyć na inny terminal i innego użytkownika).


Aby wyjaśnić:
polecenia jak w, whoitd pokazać, kto jest zalogowany na którym terminalu. To jest proste. Chciałbym jednak wiedzieć, kto jest obecnie właścicielem fizycznej konsoli (wyświetlacza, klawiatury itp.). Na przykład, jeśli dwóch użytkowników uruchamia ekrany: 0 i: 1 i mogę przełączać się między ekranami za pomocą ctrl+ alt+ 7i ctrl+ alt+ 8, chciałbym wiedzieć, który użytkownik ma obecnie połączenie między jego wyświetlaczem a rzeczywistym, fizycznym ekranem .


Jeszcze jedno wyjaśnienie:
nie jestem zainteresowany znajomością mojej nazwy użytkownika. Mam skrypt działający jako inny użytkownik lub root, który musi wiedzieć, kto korzysta z fizycznego wyświetlacza. Różni użytkownicy mogą prowadzić kilka sesji X, niektóre zwirtualizowane, niektóre podłączone do zdalnego serwera X, ale interesuje mnie tylko ta, która faktycznie wyświetla dane wyjściowe na monitorze.


Jeszcze jedno wyjaśnienie:
Niezależnie od polecenia, wyjście musi być inne po naciśnięciu Ctrl+ Alt+ F1(przejście do innej wirtualnej konsoli).

styczeń
źródło
Czy to samo pytanie?
jokerdino
Niestety nie.
stycznia

Odpowiedzi:

6

Obawiam się, że nie mogę udzielić konkretnej odpowiedzi (ponieważ nie znam dobrze technologii), ale wierzę, że można ją znaleźć za pomocą D-Bus i ConsoleKit.

Na przykład, kiedy przełączam z X na VT iz powrotem, włączam to nasłuchiwanie 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"

W szczególności można użyć metody GetActiveSession . Oto jak z dbus-send(może wymagać sudo):

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

Następnie, w zależności od aplikacji, będziesz chciał sprawdzić właściwości zwróconego obiektu, który powinien być ścieżką obiektu do sesji .

nfirwina
źródło
3
Myślę, że bardzo pomocny. Kiedy przełączam sesje, odpowiedź zmienia się odpowiednio. W szczególności mógłbym wprowadzić następującą komendę: dbus-send --system --type=method_call --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Session2 org.freedesktop.ConsoleKit.Session.GetUserktóra odpowiada bieżącym identyfikatorem użytkownika. Stamtąd funkcja biblioteczna getpwuid może uzyskać nazwę użytkownika.
John S Gruber,
1
To zdecydowanie odpowiedź, której szukałem. Dziękuję Ci bardzo!
styczeń
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 ~]$

Możesz użyć polecenia w, aby zobaczyć, kto jest zalogowany. Czas bezczynności i co powinno ci powiedzieć, co jest uruchamiane - w tym przypadku gdm oznacza aktywne logowanie, a czas bezczynności wskazuje, że użytkownik nie był w systemie od 2 dni. Porównaj to z logowaniem z blackbeauty, który ma czas bezczynności 0,00, co wskazuje, że jest on aktualnie używany.

Journeyman Geek
źródło
Nie, to tylko mi mówi - jak napisałeś - kto jest zalogowany na którym terminalu . Aby korzystać ze skryptu, chciałbym wiedzieć, jakie użytkownik posiadający konsole fizyczny (klawiatura, wyświetlacz itd.)
styczeń
Czas bezczynności PS jest również nieinformacyjny; Pracuję nad skryptem majstrującym przy wygaszaczu ekranu, ale chcę wiedzieć, który użytkownik uruchamia wygaszacz ekranu, który jest faktycznie wyświetlany .
grudnia
TTY i „co” może tu działać, wystarczy wyodrębnić niezbędne elementy.
Journeyman Geek
Hm, nie, ponieważ może działać gdziekolwiek (w tle, na innym serwerze X, w maszynie wirtualnej)
styczeń
1

Jest wiele sposobów:

  • whoami
  • w
  • echo $USER
  • logname
hytromo
źródło
0

Innym poleceniem jest

whoami

Pokazuje bieżącą nazwę użytkownika logowania

Ketan Patel
źródło