Wie finde ich heraus, wer als root angemeldet ist?


7

Kürzlich habe ich gefragt: " Wie liste ich angemeldete Benutzer auf? " Der Befehl whoeignet sich gut für diesen Zweck. Aber wie finde ich heraus, wer als root angemeldet ist? Wird der Benutzername "root" sein?

Antworten:


7

Ich gehe davon aus, dass das Root- Konto nicht aktiviert ist (wie es standardmäßig der Fall ist), sodass nur sudo -iein Benutzer root werden kann . Mein Vorschlag ist das folgende Skript, das die Befehle verwendet who -uund pgrep -at <tty parsed from who -u>herausfindet, userauf welchen ttyder Befehl ausgeführt wurde sudo -i.

#!/bin/bash
LANG=C who -u | while read -a line; do  # Output the whole line: echo "${line[@]}"
        IS_ROOT="$(pgrep -at "${line[1]}" | grep 'sudo -i')"
        [[ ! -z "${IS_ROOT}" ]] && printf '%-7s ( PID %-6s at %s on TTY %-7s) is ROOT: %s %s\n' "${line[0]}" "${line[5]}" "${line[4]}" "${line[1]}" "$IS_ROOT"
done | sed '/grep sudo -i/d' | sort -k13 -k6

Erläuterung:

  • who -uZeigt die Benutzer an, die mit den PIDs ihrer Sitzungen angemeldet sind. Wahrscheinlich LANG=Cist dies nicht obligatorisch - es wird platziert, um ein identisches Zeit- / Datumsformat auf Maschinen mit unterschiedlichen localeEinstellungen zu gewährleisten .

  • Die Schleife whilegibt dodie Befehle aus, während sich auf dem Standard Stream befindet .

  • Der Befehl read -aliest den Eingabestream zeilenweise und weist diese Zeilen der "Variablen" als Array zu $line. Wir könnten die ganze Zeile mit einem Befehl ausgeben als : echo "${line[@]}". Bedeutet ${line[1]}also die zweite Variable des Arrays $line(die erste ist 0). Im aktuellen Fall ${line[1]}ist der TTY aus dem Ausgang von who -u.

  • Hier ist ein einfaches Skript, das eine "Tabelle" mit den Beziehungen zwischen den Array-Elementen und ihren Werten ausgibt:

    line=( $(LANG=C who -u | head -1) ); for i in {0..6}; do printf '%-11s' "${line[$i]}"; done; echo; for i in {0..6}; do printf '${line[%s]} ' "$i"; done; echo
    
    guest      tty7       2018-01-03 09:52      old        1847       (:0)
    ${line[0]} ${line[1]} ${line[2]} ${line[3]} ${line[4]} ${line[5]} ${line[6]}
    
  • Die Ausgabe des Befehls pgrep -at "${line[1]}" | grep 'sudo -i'wird als Wert $()für die Variable signiert $IS_ROOT.

  • Der Befehl pgrep -at "TTY"gibt die PIDs aller Prozesse für bestimmte TTY-Optionen aus -t --terminal, und die Option -a --list-namelistet die PIDs und Prozessnamen auf.

  • Der Ausdruck [[ ! -z "${IS_ROOT}" ]] &&könnte folgendermaßen gelesen werden: Wenn [die Variable "${IS_ROOT}"nicht !leer ist, -zdann &&oder sonst ||.

  • Mit dem printfBefehl wird die Ausgabe ( Referenz ) formatiert :

    printf '%s some text %s` "$var1" "$var2"
  • Schließlich sed '/grep sudo -i/d'wird die unbeaufsichtigte Zeile (die unseren Befehl enthält grep 'sudo -i') aus der Ausgabe von gelöscht whileund sort -k13 -k6die Ausgabe nach den Spalten 13 und 6 sortiert.


Rufen Sie das Skript auf find-root, machen Sie es ausführbar ( chmod +x find-root) und führen Sie es aus.

Hier ist eine einfache Ausgabe:

$ ./find-root
spas    ( PID 14035  at 12:54 on TTY pts/20 ) is ROOT: 23518 sudo -i
spas    ( PID 14035  at 12:36 on TTY pts/4  ) is ROOT: 23589 sudo -i
guest   ( PID 23575  at 15:00 on TTY pts/4  ) is ROOT: 23589 sudo -i
guest   ( PID 24321  at 15:30 on TTY tty1   ) is ROOT: 24386 sudo -i

Hier ist eine Demonstration (in einer muttSitzung), wie das Skript funktioniert ( in seiner vorherigen Version ):

Geben Sie hier die Bildbeschreibung ein


Platzieren Sie das Skript /usr/local/bin, um es als Shell-Befehl verfügbar zu machen. Kopieren Sie dazu die folgenden Zeilen und führen Sie sie als Einzelbefehl aus:

cat << EOF | sudo tee /usr/local/bin/find-root && sudo chmod +x /usr/local/bin/find-root
#!/bin/bash
LANG=C who -u | while read -a line; do 
        IS_ROOT="\$(pgrep -at "\${line[1]}" | grep 'sudo -i')"
        [[ ! -z "\${IS_ROOT}" ]] && printf '%-7s ( PID %-6s at %s on TTY %-7s) is ROOT: %s %s\n' "\${line[0]}" "\${line[5]}" "\${line[4]}" "\${line[1]}" "\$IS_ROOT"
done | sed '/grep sudo -i/d' | sort -k13 -k6
EOF

Erläuterung:

  • Der Befehl cat << EOFgibt die nächsten Zeilen aus, es sei denn, die Zeichenfolge EOFwird gefunden. Beachten Sie die Backslashes \$, die dem Sonderzeichen entgehen $und buchstäblich in cat ausgegeben werden.

  • Diese Ausgabe wird |an den Standard des Befehls tee(ausgeführt von sudo) weitergeleitet, der die Datei schreibt /usr/local/bin/find-root.

  • Wenn der vorherige Befehl erfolgreich ist, wird &&der Befehl suddo chmod +xausgeführt.


Siehe auch:


1
Da Sie bash verwenden, können Sie das read -aArray zuweisen und vermeiden, awk zum Parsen zu verwenden, oder einfach Tonnen von Variablen mit zuweisen read. Nur ein Vorschlag. Schönes Drehbuch
Sergiy Kolodyazhnyy

Vielen Dank für den Rat @SergiyKolodyazhnyy! Ich habe die Antwort umgeschrieben.
pa4080

@ pa3080 Awesome :) Sieht ziemlich gut aus
Sergiy Kolodyazhnyy

4

Unter Ubuntu ist die Anmeldung bei einem rootKonto deaktiviert. sudoBenutzer können sich jedoch weiterhin als Root über anmelden sudo -i. Doch weder whound wBefehl auf Ubuntu zeigen Sie als root angemeldet werden:

$ sudo -i
[sudo] password for xieerqi: 
$ who
xieerqi  tty7         2017-11-27 23:39 (:0)
xieerqi  pts/14       2017-11-27 23:39 (:0)
xieerqi  pts/0        2017-11-28 00:25 (:0)

Hier bin ich in angemeldet pts/14über sudo -i, aber meine ursprünglichen Benutzername immer noch da. Sie können jedoch die Prozessliste filtern, um die auf diesem Terminal ausgeführte Shell zu finden. Natürlich wird dieser Prozess als root ausgeführt.

$ ps -u root | awk '$2 ~ /pts/'                                                                
 4170 pts/14   00:00:00 sudo
 4172 pts/14   00:00:00 bash

Auf diese Weise können Sie durch Querverweise herausfinden, wer als Root im Terminal angemeldet ist. Denken Sie daran, dass Sie auch ttyin den Befehl awk aufnehmen sollten, falls Root-Benutzer angemeldet sind tty.

Eine andere Möglichkeit wäre, /var/log/auth.logwie bereits in anderen Antworten vorgeschlagen zu filtern :

awk '/USER=root/' /var/log/auth.log

Dies ist jedoch eine Protokolldatei. Es wird nur angezeigt, wer sich angemeldet hat oder nicht angemeldet hat, nicht, wer sich derzeit auf Superuser-Ebene befindet.


1
Seltsame Sache, wenn Sie screenwährend des Seins verwenden sudo suund ein paar Fenster darin erstellen, werden alle angemeldet whound wals rootanstelle des Benutzernamens -> i.stack.imgur.com/iz2zs.png
Videonauth

@videonauth, das hängt wahrscheinlich auch davon ab, ob das Terminal bei der utmpAnmeldedatenbank registriert ist oder nicht , welcher Bildschirm dies tut. Ich hatte Probleme mit wallim Gnome-Terminal, weil ich gnome-terminal mich nicht bei utmp registriert habe. Habe sogar eine Frage dazu gepostet.
Sergiy Kolodyazhnyy

0

Geben Sie dies ein

sudo less /var/log/auth.log

Von dort aus können Sie alle Anmeldungen durchsuchen, einschließlich derer, die auf root zugreifen


danke. Aber es wird angezeigt: Entschuldigung, Benutzer "Benutzername" darf '/ usr / bin / less /var/log/auth.log' nicht als root auf "Servername" ausführen.
Anony

Stellen Sie sicher, dass der Benutzername, den Sie haben, Root-Rechte haben oder zur sudo-Gruppe gehören. Danach können Sie ihn anzeigen
Yien

Nur aus Neugier, was ist, wenn ich ein normaler Benutzer bin?
Anony

Ohne Sudo-Berechtigungen können Sie dies nicht tun, da die meisten Protokolldateien zu einer Gruppe gehören, für die Superuser-Berechtigungen erforderlich sind, es sei denn, Sie haben dies natürlich nicht geändert. Aufgrund Ihrer Fragen hier ist es jedoch nur darauf beschränkt, eine andere zu stellen. Wählen Sie hier eine Antwort, die zu Ihnen passt, und stellen Sie eine andere Frage.
Yien

0

Normalerweise heißt das SuperUser- oder Root-Konto in Ubuntu root, ist jedoch vom System gesperrt und Sie können sich nicht anmelden. Um Ihre Frage zu beantworten, ja, der Benutzername wäre root, obwohl Sie ihn nicht verwenden können, ohne ihn zu entsperren.

Um es zu entsperren, geben Sie Folgendes in ein Terminal ein:

sudo -i

Legen Sie dann ein Passwort für root fest:

sudo passwd root

Weitere Informationen hierzu finden Sie hier:

https://help.ubuntu.com/community/RootSudo


Wer kann darauf zugreifen?
Anony

@Anony durch Verwendung von sudo im Terminal oder Eingabe von sudo su, um das Terminal zu rooten
Max

@Anony oder indem Sie sudo -i und dann sudo passwd root verwenden, um das benutzerdefinierte Kennwort für root festzulegen.
Max
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.