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?
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:
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 ):
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:
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.
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
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.
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 -aArray zuweisen und vermeiden, awk zum Parsen zu verwenden, oder einfach Tonnen von Variablen mit zuweisenread. Nur ein Vorschlag. Schönes Drehbuch