Kürzlich habe ich gefragt: " Wie liste ich angemeldete Benutzer auf? " Der Befehl who
eignet sich gut für diesen Zweck. Aber wie finde ich heraus, wer als root angemeldet ist? Wird der Benutzername "root" sein?
Kürzlich habe ich gefragt: " Wie liste ich angemeldete Benutzer auf? " Der Befehl who
eignet sich gut für diesen Zweck. Aber wie finde ich heraus, wer als root angemeldet ist? Wird der Benutzername "root" sein?
Antworten:
Ich gehe davon aus, dass das Root- Konto nicht aktiviert ist (wie es standardmäßig der Fall ist), sodass nur sudo -i
ein Benutzer root werden kann . Mein Vorschlag ist das folgende Skript, das die Befehle verwendet who -u
und pgrep -at <tty parsed from who -u>
herausfindet, user
auf welchen tty
der 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 -u
Zeigt die Benutzer an, die mit den PIDs ihrer Sitzungen angemeldet sind. Wahrscheinlich LANG=C
ist dies nicht obligatorisch - es wird platziert, um ein identisches Zeit- / Datumsformat auf Maschinen mit unterschiedlichen locale
Einstellungen zu gewährleisten .
Die Schleife while
gibt do
die Befehle aus, während sich auf dem Standard Stream befindet .
Der Befehl read -a
liest 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-name
listet die PIDs und Prozessnamen auf.
Der Ausdruck [[ ! -z "${IS_ROOT}" ]] &&
könnte folgendermaßen gelesen werden: Wenn [
die Variable "${IS_ROOT}"
nicht !
leer ist, -z
dann &&
oder sonst ||
.
Mit dem printf
Befehl 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 while
und sort -k13 -k6
die 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 mutt
Sitzung), wie das Skript funktioniert ( in seiner vorherigen Version ):
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 << EOF
gibt die nächsten Zeilen aus, es sei denn, die Zeichenfolge EOF
wird 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 +x
ausgeführt.
Siehe auch:
Unter Ubuntu ist die Anmeldung bei einem root
Konto deaktiviert. sudo
Benutzer können sich jedoch weiterhin als Root über anmelden sudo -i
. Doch weder who
und w
Befehl 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 tty
in den Befehl awk aufnehmen sollten, falls Root-Benutzer angemeldet sind tty
.
Eine andere Möglichkeit wäre, /var/log/auth.log
wie 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.
screen
während des Seins verwenden sudo su
und ein paar Fenster darin erstellen, werden alle angemeldet who
und w
als root
anstelle des Benutzernamens -> i.stack.imgur.com/iz2zs.png
utmp
Anmeldedatenbank registriert ist oder nicht , welcher Bildschirm dies tut. Ich hatte Probleme mit wall
im Gnome-Terminal, weil ich gnome-terminal
mich nicht bei utmp registriert habe. Habe sogar eine Frage dazu gepostet.
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
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:
read -a
Array zuweisen und vermeiden, awk zum Parsen zu verwenden, oder einfach Tonnen von Variablen mit zuweisenread
. Nur ein Vorschlag. Schönes Drehbuch