Log Datei auswerten und andes ausgeben

V

van_haakonnen

Jungspund
Hallo Leute,

ich habe mal eine Frage an euch... Ich habe hier eine Log Datei. Pro Zeile steht dort ein User drin mit dem Datum wann sein Passwort abläuft. Das sieht dann z.B. so aus:

y00999999: abgelaufen seit 1 Tagen - (password will expire: Sat Dec 31 13:10:33 2005)

oder mit richtigem Usernamen:
willie: abgelaufen seit 1 Tagen - (password will expire: Sat Dec 31 13:10:33 2005)

Diese Datei enthält tausende solcher Eintragungen mit abgelaufenden Passwörtern von Usern.

Jetzt will ich ein kleines Script basteln, in dem man einfach als Variable die Zeit eingeben kann seit wann das Passwort abgelaufen ist (die Zeit ruhig in Tagen). Dann sollen alle User deren Pwd. abgelaufen ist untereinander in eine neue Datei geschrieben werden.

DAs ist eigentlich alles. Aber ich verstehe einfach gerade nicht wie ich das fertig bringe... :hilfe2:

Ich wäre euch sehr dankbar wenn ihr mir ein bisschen helfen könntet

Vielen Dank
 
herzlich willkommen!

wieviele user hast du denn?
wenn ich das richtig verstehe könnte dir das hier vielleicht helfen:
cat /var/log/messages | grep username (oder ein anderer string) > datei.txt

das ablaufdatum wird ja über die datei /etc/shadow bzw. ferner über login.defs definiert. du könntest natürlich aus der shadow-datei den entsprechenden namen herausnehmen und den entsprechenden eintrag mit cut ausschneiden
 
Hallo
Schau dir einfach grep, sed cut und/oder perl an.
Damit geht sowas sehr leicht zu realisieren.
Wenn du es als richtiges Script (statt einen Einzeiler) willst,
Dann schau dir noch an wie man Parameter übergibt.
Kleines Beispiel:
Code:
#!/bin/bash
P="abgelaufen seit ${1} Tagen";
FILE=inputfile.log;
OFILE=output.txt;
grep  "$P" [b]$FILE[/b]|cut -d: -f1 >>/PATH/TO/$OFILE;

Ganz ungeprüft auf die Schnelle.
Natürlich sollten da noch Fehlerprüfungen rein.
e.g. ob die Datei existiert, lesbar, schreibbar ist und/oder der Parameter korrekt...

Gruß Wolfgang

Edit:
Fiptehler korrigiert ;)
 
Zuletzt bearbeitet:
Vielen Dank für deine schnelle Antwort.

Also es handelt sich hierbei um ein ganz eigenes System. Die Datei die ich hier als Log-Datei habe wird auch schon "nur" durch ein Script erstellt.

Ich brauche jetzt also ein weiteres Script (das ausschließlich die Informationen aus dieser einen Log-Datei bekommt) um alle Usernamen in eine neue Datei untereinander zu schreiben, dassen Account bereits schon X Tage abgelaufen ist.

Die Dauer (also wie lange der Account bereits abgelaufen ist) soll man als Variable angeben können.

Und noch eine Sache... Das klingt blöd aber ich bin ehrlich.. ich habe wirklich keine ahnung. Also auch nicht viel von den bash - Sachen... Bitte immer erklären... :think:


edit:

wow - danke für die zweite Anwort Wolfgang! Probiere ich gleich mal aus :-)

edit2:

Also da bekomme ich folgendes:
81-2-133-8:/home/Script2# ./Script.sh
grep: abgelaufen: No such file or directory
grep: seit: No such file or directory
grep: Tagen: No such file or directory

Wie kann ich denn die Angabe mit den Tagen genauso in eine Variable schreiben wie du es mit den Pfaden gemacht hast?

und kann es sein, dass FILE gar nicht verwendet wird? Er also gar nicht weiß wo in welcher Datei er danach suchen soll? Weil OFILE z.B. taucht ja später nochmal auf. :)
 
Zuletzt bearbeitet:
Hallo
Noch ein Hinweis:
So bekommst du natürlich nur die User, deren Passwort Verfallsdatum genau auf den Parameter zutrifft.
Ob du das so willst, hast du nicht genau angegeben.

Wenn du alle deren Datum größer als dein Parameter ist haben willst, muss du etwas anders vorgehen.

Noch ein Beispiel (hoffe diesmal ohne Fehler;))
Code:
#!/bin/bash
FILE=inputfile.log;  #Inputfile
OFILE=output.txt;    #Outputfile
I=$1;                #Parameter
while read USER adummy bdummy T Rest ;#einlesen und die Werte Variablen zuweisen
do
if [ $T -gt $I ] ;#Prüfe ob die Zeit größer als unser Parameter ist (-gt)
# Bei Gleichheit und größer wär es dann -ge
then
#wenn ja, ausgeben und Doppelpunkt entfernen
 echo "$USER"|tr -d ":"; #tr -d entfernt den :
 fi;
done <"$FILE" >"$OFILE" 
echo "All done";#Ende

Hoffe du kommst mit der Erklärung soweit klar.
Gruß Wolfgang
 
Vielleicht klappt es damit, angenommen, dass Deine Log-Datei ablaufer.log heisst:
Code:
#/bin/bash
grep "abgelaufen seit" ablaufer.log | awk -v SEIT=$1 '{ if ( $4 >= SEIT ) print $0}' | awk --field-separator : '{print $1}'

Mit dem 'grep' Teil (bis zum '|' Zeichen )filterst Du alle Zeilen, in dene etwas ueber 'abgelaufen' steht. Mit dem ersten 'awk' Teil (bis zum zweiten '|' Zeichen) filterst Du alle Zeilen raus, bei denen das 4. Zeichen - als Zahl interpretiert - groesser oder gleich dem ersten Parameter Deines Skriptes ist. Mit dem letzten 'awk' Teil filterst Du aus diesen Zeilen das erste Wort bis (ausschliesslich) dem Doppelpunkt, da Du ja nur die user-Namen wolltest.
Dieses Skript schreibt nach stdout. Moechtest Du die Ausgabe in eine Datei Umleitung, schreibst Du entweder ans Ende der langen Zeile ein ' > ausgabe.txt' oder rufst Dein Skript mit dieser Umleitung auf.
 
Jawohl - vielen Dank. Funktioniert ohne Probleme :) Also beide Varianten. Ich habe mich jetzt für die von Wolfgang entschieden.

Hm... ich werde bestimmt noch weiterhin eure Hlfe brauchen. Ich muss nämlich jetzt von dieser erstellen Userliste aus noch weiter machen... aber da muss ich erst selbst verstehen was ich überhaupt machen soll... 8)

Dankeeeeschön


--------------------------------

Okay - es ist soweit. Ich brauche wieder eure HIlfe. Das ganze wird schwieriger...

Wir haben jetzt also die Ausgabe sämtlicher User in eine Datei. Jetzt brauche ich das ganze noch ein kleinwenig modifiziert...

Bei den Benutzerkennungen gibt es zwei Arten. Einmal welche die mit y0..... beginnen und andere die einfach mit dem richtigen Namen anfangen. Ich muss diese voneinander trennen und auch in getrennte Dateien ausgeben lassen.

Dann geht es leider noch schwieriger weiter und ich bin völlig überfordert:

Ich habe jetzt dann eine weitere Datei popmail. In dieser Datei stehen die User und Ihre Zuordnung zu Servern.
Ich muss nun aus den Ergebnissen (also den Usern) der zwei Textdateien (einmal für Benutzer mit y0....-Nummern und allen Anderen Namen) Ihre Serverzugehörigkeit herausfinden.

Der Inhalt der Datei sieht z.B. so aus:
**********
**********

Daraus sollen dann für jeden Server am Ende zwei Textdateien erstellt werden mit Benutzern (y-Nummern und normalen Namen) deren Passwort seit X Tagen abgelaufen ist.

Also habe ich jetzt diese zwei Dateien:
1) meine AUsgabe mit den Benutzern deren Passwörter abgelaufen sind
2) die Datei wo die benutzer nochmals vorkommen mit dem passenden Server

Am Einfachsten wäre es vielleicht wenn man jetzt den servernamen mit dem @server1.firma.de aus der zweiten Datei jeweils an den benutzernamen aus der ersten hängt.

Dann hätte man gleich alle Benutzer mit abgelaufendem passwort und den dazugehörigen Server.

Jetzt müsste man die Benutzer auf die einzelnen Server aufteilen. Also Einzelne dateien erstellen (einmal für y-Nummern und einmal für alle anderen Benutzernamen) pro Server. hmhmhm...
 
Zuletzt bearbeitet:

Ähnliche Themen

CSV Datei mit sed manipulieren/optimieren/ergänzen

Datei-Besitzer / Zugriffsrechte am Client ändern Seltsames Verhalten von Samba

Festplatte stirbt, dd funktioniert nicht

HP PSC 2175 - CUPS druckt nicht

log-auswertung

Zurück
Oben