Ich habe eine einfache einspaltige Benutzerliste. Sie stammt aus dem Lastlog-Befehl. Ich muss feststellen können, ob diese Konten deaktiviert sind und ich keinen Root-Zugriff habe. Ich kann sie nur mit „more“ anzeigen und den Lastlog-Befehl ausführen. Ich muss sehen, ob Benutzer, die sich in den letzten 90 Tagen nicht angemeldet haben, noch aktiv sind.
Bisher führe ich
sudo lastlog -b 90
Dadurch erhalte ich die Benutzer, die sich in den letzten 90 Tagen angemeldet haben. Jetzt führe ich es einfach durch awk aus und drucke das erste Feld aus, und das ist meine einfache Benutzerliste. Jetzt möchte ich grundsätzlich sehen, ob in /etc/passwd ihre Shell /bin/bash ist und ob in /etc/shadow ein !
in ihrer Zeile steht. Wie kann ich das machen? Ich habe es mit For- und While-Schleifen versucht und scheine es nicht richtig hinzubekommen? Für jede Hilfe wäre ich dankbar.
Antwort1
Ich bin nicht sicher, ob ich Sie richtig verstehe. Ist es das, was Sie wollen?
lastlog -b 90 | awk '{if (NR > 1) print $1 }' | grep -f - /etc/passwd | grep "/bin/bash$"
Hier ist die Aufschlüsselung:
awk '{if (NR > 1) print $1 }'
- Drucken Sie die erste Spalte und überspringen Sie die erste Zeile (Kopfzeile des Lastlogs).grep -f - /etc/passwd
- Verwenden Sie die Standardeingabe als Datei, um Muster abzurufen und in diesen nach Mustern zu suchen./etc/passwd
grep "/bin/bash$"
- grep für /bin/bash,$
bedeutetEOL
.
Einige Anmerkungen:
lastlog -b 90
- das gibt Ihnen Aufzeichnungenälterals 90 Tage. Wenn Sie Benutzer möchten, die sich innerhalb der letzten 90 Tage angemeldet haben, verwenden Sielastlog -t 90
.- Ich habe mich nur für
(NR > 1)
die Lösung entschieden, weil wir sie sowieso verwendenawk
. Eine prägnantere Möglichkeit, die erste Zeile einer Datei zu überspringen, wäresed 1d
.
BEARBEITEN
Sie können eine ähnliche Ausdrucksweise verwenden, wenn Sie auch die Datensätze aus /etc/shadow herausfiltern möchten !
. Der vollständige Befehl wäre dann:
lastlog -b 90 | awk '{if (NR > 1) print $1 }' | grep -f - /etc/passwd | grep "/bin/bash$" | cut -d ':' -f 1 | grep -f - /etc/shadow | grep -v ":\!:"
cut -d':' -f 1
teilt die Zeile mit:
als Trennzeichen und gibt das erste Feld zurückgrep -v
bedeutetÜbereinstimmung umkehren(nicht übereinstimmende Zeilen auswählen).
Antwort2
Wie Sie bemerkt haben, muss das Ausrufezeichen „ausgeblendet“ werden – versuchen Sie, die Suche danach zuerst mit einem Backslash einzugeben: \! statt !, damit es nicht wie ein Befehl ausgeführt wird, sondern als Text behandelt wird. In vielen Fällen können Sie es auch mit einfachen Anführungszeichen (nicht doppelten) wie folgt zitieren: „!“ – je nachdem, welchen Befehl Sie wählen, sollte einer dieser Befehle dies für Sie erledigen.