Vergleichen Sie eine Liste von Benutzern mit /etc/passwd

Vergleichen Sie eine Liste von Benutzern mit /etc/passwd

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, $bedeutet EOL.

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 Sie lastlog -t 90.
  • Ich habe mich nur für (NR > 1)die Lösung entschieden, weil wir sie sowieso verwenden awk. Eine prägnantere Möglichkeit, die erste Zeile einer Datei zu überspringen, wäre sed 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 1teilt die Zeile mit :als Trennzeichen und gibt das erste Feld zurück
  • grep -vbedeutetÜ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.

verwandte Informationen