Wie finde ich heraus, wer die physische Konsole verwendet?

10

Ich möchte ein Skript verwenden, um den Benutzernamen des Benutzers herauszufinden, der sich derzeit auf der physischen Konsole befindet (der über Tastatur, Maus und grafische Anzeige verfügt).

Ich möchte nicht nur wissen, wer X ausführt (da die aktuelle Konsole auf ein anderes Terminal und einen anderen Benutzer umgeschaltet werden kann).


Zur Klarstellung:
Befehle wie w, whousw. zeigen , wer an welchem Terminal angemeldet ist. Das ist einfach. Ich würde jedoch gerne wissen, wem derzeit die physische Konsole (Display, Tastatur usw.) gehört. Wenn beispielsweise zwei Benutzer Anzeigen ausführen: 0 und: 1 und ich mit ctrl+ alt+ 7und ctrl+ alt+ zwischen den Anzeigen wechseln kann 8, möchte ich wissen, welcher Benutzer derzeit die Verbindung zwischen seiner Anzeige und dem tatsächlichen physischen Bildschirm hat .


Noch eine Klarstellung:
Ich bin nicht daran interessiert, meinen eigenen Benutzernamen zu kennen. Ich habe ein Skript, das als anderer Benutzer oder Root ausgeführt wird und wissen muss, wer die physische Anzeige verwendet. Es können mehrere X-Sitzungen von verschiedenen Benutzern ausgeführt werden, von denen einige virtualisiert und einige mit einem Remote-X-Server verbunden sind. Ich interessiere mich jedoch nur für die Sitzung, die tatsächlich die Ausgabe auf dem Monitor anzeigt.


Noch eine Klarstellung:
Unabhängig vom Befehl muss die Ausgabe nach dem Drücken von Ctrl+ Alt+ F1(Umschalten auf eine andere virtuelle Konsole) unterschiedlich sein.

Januar
quelle
Ist das eine Selbst-Q & A?
Jokerdino
Leider nein.
Januar

Antworten:

6

Ich fürchte, ich kann Ihnen keine konkrete Antwort geben (weil ich die Technik nicht gut kenne), aber ich glaube, Sie können es mit D-Bus und ConsoleKit herausfinden.

Wenn ich zum Beispiel von X zu einem VT und zurück wechsle, höre ich Folgendes 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"

Insbesondere können Sie die GetActiveSession- Methode verwenden. So geht's mit dbus-send(möglicherweise erforderlich sudo):

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

Abhängig von Ihrer Anwendung möchten Sie dann die Eigenschaften des zurückgegebenen Objekts überprüfen, bei denen es sich um einen Objektpfad zu einer Sitzung handeln sollte .

Nfirvine
quelle
3
Sehr hilfreich, denke ich. Wenn ich Sitzungen wechsle, wechselt die Antwort entsprechend. Insbesondere könnte ich dann folgenden Befehl eingeben: dbus-send --system --type=method_call --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Session2 org.freedesktop.ConsoleKit.Session.GetUserder mit der aktuellen Benutzer-ID antwortet. Von dort kann die Bibliotheksfunktion getpwuid den Benutzernamen erhalten.
John S Gruber
1
Dies ist definitiv die Antwort, nach der ich gesucht habe. Vielen Dank!
Januar
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 ~]$

Mit dem Befehl w können Sie sehen, wer angemeldet ist. Die Leerlaufzeit und was sollte Ihnen sagen, was ausgeführt wird - in diesem Fall zeigt gdm eine aktive Anmeldung an, und die Leerlaufzeit zeigt an, dass der Benutzer seit 2 Tagen nicht mehr im System war. Vergleichen Sie dies mit dem Login von blackbeauty, das eine Leerlaufzeit von 0,00 hat, was darauf hinweist, dass es derzeit verwendet wird.

Geselle Geek
quelle
Nein, das sagt mir nur - wie Sie geschrieben haben - wer an welchem Terminal angemeldet ist . Um mit einem Skript zu verwenden, würde Ich mag wissen , welcher Benutzer ist die physische Konsole besitzt (Tastatur, Display etc.)
Januar
Die PS-Leerlaufzeit ist ebenfalls nicht informativ. Ich arbeite an einem Skript, das mit einem Bildschirmschoner spielt, aber ich möchte wissen, welcher Benutzer den tatsächlich angezeigten Bildschirmschoner ausführt .
Januar
Das TTY und 'was' könnte hier funktionieren, Sie müssten nur die notwendigen Bits extrahieren.
Geselle Geek
Ähm, nein, weil es überall dort , wo (im Hintergrund, auf einem anderen X - Server in einer virtuellen Maschine) läuft
Januar
1

Es gibt viele Wege:

  • whoami
  • w
  • echo $USER
  • logname
Hytromo
quelle
0

Ein weiterer Befehl ist

whoami

Es zeigt den aktuellen logeed Benutzernamen

Ketan Patel
quelle