Benutzer Shell für Profis

deadman

deadman

Grünschnabel
Hallo.

Ich bin gerade in meiner Ausbildung und beschäftige mich viel mit Linux. Ich lese immer sehr viel hier in diesen Forum von Anderen.
Nun habe ich mich auch mal hier angemeldet, weil ich einfach nicht weiterkomme.
Ich bin kein Profi im Shell. Ich probiere gern mit Linux und mit der Shellprogammierung. Jetzt habe ich eine Aufgabe bekommen und zwar soll ich nen Script schreiben was folgendes macht:


Überprüfung aller Benutzerkonten mit folgenden Kriterien:
1. ist der letzte Zugriff(Anmeldung) älter als 1. Jahr dann den Benutzer und das Homeverzeichnis von Benutzer löschen.

2.ist der letzte Zugriff älter als 6 Monate(bis 1 Jahr) dann soll der Benutzer eine E-Mail vom System(Root) bekommen mit folgenden Inhalt:
"Letzter Zugriff(Anmeldung) am ....
Passwort bitte ändern!"

3.ist der letzte Zugriff äkter als 3 Monate(bis 6 Monate) dann soll der Benutzer ein Hinweis bei der Anmeldung bekommen und zwar:
"Hallo, Sie waren lange nicht angemeldet."

Ich habe auch schon nen paar Befehle gefunden:
/usr/sbin/usermod
/usr/sbin/userdel
/usr/sbin/useradd
/usr/bin/id

lastlog --> weiß nicht ob das auch klappt???(

Ich sitze schon zwei Tage dran bekomm das Script auch irgendwie nicht zusammen. Bin ich zu dumm oder mach ich nur etwas mit den Befehlen falsch?:(

Danke
 
poste doch mal, was du bis jetzt hast. dann koennen wir ueberpruefen was falsch ist.
 
Hallo,

die Anmeldungen werden unter Linux normalerweise in /var/log/wtmp gespeichert. Das Logfile kannst Du nicht mit einem Texteditor anschauen, aber mit "last" auslesen. In der Regel wird das Logfile von logrotate weggepackt, wenn es eine bestimmte Größe oder ein bestimmtes Alter erreicht hat. Bei mir gibt es da z.B. ein File, das wtmp-20060213.gz heißt.

Du müsstest jetzt für Dein erstes Problem die wtmp-Files zusammenpacken, bis alles innerhalb des letzten Jahres in einem File steht. Alle User, die sich in diesem Zeitraum nicht angemeldet haben, werden dann gesperrt oder entfernt.

Poste mal Deinen Versuch, das kriegen wir dann schon hin.

EDIT: Und poste mal Deine Gedanken zum grundsätzlichen Design des Skripts. Woher kommen die Benutzer? Was bringt es, an einen User Mail zu schicken, der sich ohnehin nie anmeldet (und dann seine Mail nie liest) oder soll die Mail woanders hin, wo er sie liest? Wie bekommst Du die System-User von den echten Usern getrennt (Du willst ja keine System-User löschen)?

Gruß
 
Zuletzt bearbeitet:
Hallo

Du hast eine Aufgabe bekommen, da macht es wenig Sinn diese hier lösen zu lassen.
Wir werden dir sicher helfen, wenn du an einem Problem hängenbleibst.
Bis dahin, solltest du aber erstmal ein paar eigene Ansätze versuchen.

Schreib dir erstmal den Ablauf auf einen Zettel, und versuche dann die einzelnen Schritte umzusetzen.
Lies dir dazu die Manpages der benutzen Programme durch.
Was dir zur Verfügung steht, ist vom System und der verwendeten Shell abhängig.
Grobe Vorgehensweise als Vorschlag:
  • Zeitpunkte in Tagen ermitteln (man date)
  • Beim ältesten Datum beginnen mit (lastlog -t xxx),
  • Benutzer die verarbeitet wurden kennzeichnen und Gruppieren.(Schnittmenge entfernen)
  • Die drei Benutzergruppen mit jeweiligen Aktionen abarbeiten.

Noch ein paar Tipps:
Um die Message zu erzeugen, kann bei einigen Systemen die Variable MOTD_FILE gesetzt werden, was dann die entsprechende Datei ausgibt statt /etc/motd auszugeben.

Zum Mailen simpel mail user <<EOF ... also Heredocument verwenden.

Nun viel Glück
Gruß Wolfgang
 
Hallo und danke erstmal für die Antworten

also mein eigentliches Problem ist ich weiß nicht wie ich anfangen soll und vorallem wo???

Wolfgang hat mir zwar schon nen paar heiße Tipps gegeben, aber trotzdem scheitere ich am Anfang.
 
Was hast Du bisher gemacht? Hast Du Wolfgangs Beitrag aufmerksam gelesen? Beschreibe in kleinen Stichpunkten, was das Du für Eingangsdaten hast, was das Skript damit anfangen soll und was als Ergebnis herauskommen soll.

Gruss, Xanti
 
Hi. Also hier mal mein Ablaufplan.

1.Abfrage aller Benutzer

2.Wenn der Benutzerzugriff älter als ein Jahr (365 Tage) ist
, dann
2.1.JA - Löschen des Benutzers + Homeverzeichnis
2.2.NEIN - Weiter bei 3

3. Wenn der Benutzerzugriff älter als 6 Monate (180 Tage) ist
, dann
3.1.JA - Benutzer bekommt eine E-Mail mit folgenden Text:
"letzter Zugriff am:..." und "Bitte Passwort ändern"
3.2.NEIN - Weiter bei 4

4. Wenn der Benutzzugriff älter als 3 Monate (90 Tage) zst
, dann
4.1. JA - eine Nachricht schciken mit folgenden Inhalt:
"Hallo, du warst lang nicht mehr angemeldet."
4.2. NEIN - Nichts tun.

So ich hab schonmal nen bisschen rumprobiert. Und zwar hab ich ein Problem den LASTLOG -t macht das mit den Tagen genau verkehrtherum.

Muss ich das wenn mit if machen?

Danke Vielmals
 
Hallo

Du musst die Bedingungen von der kürzesten Zeit an abfragen.
lastlog -t10 gibt dir die User aus, die innerhalb der letzten 10 Tage eingelogt waren.
Wenn du deine Userliste durchgehst, dann benutze die Filter von der kürzesten Zeit bis zur längsten. Verlasse die Abfrage wenn du einen Treffer hast.
Wer also in den letzten 90 Tagen eingelogt war, war ja auch innerhalb des letzten jahres eingelogt. logesch ;)

Also würdest du nun drei Gruppen erstellen. Entweder Array oder Dateien.

  • Userliste durchgehen
  • Abfragen ob innerhalb der letzten 90 Tage der User auftaucht. Wenn Ja, in Liste 1 eintragen und nächsten User ( continue)
  • Sonst abfragen ob länger als ein halbes Jahr.elif ¹Wobei du die Anzahl der Tage für ein halbes Jahr noch ermitteln musst!
    Wenn Ja, in Liste 2 eintragen und nächsten User ( continue)
  • Sonst abfragen ob länger als ein Jahr.elif
    Wenn Ja, in Liste 3 eintragen und nächsten User ( continue)
  • Benutzer war noch nie eingelogt.else
¹ Ein halbes Jahr ist nicht 180 Tage, und variiert abhängig davon in welchem Monat du stehst, wenn es nach Monaten berechnet wird. 1/2 Jahr = 6 Monate.
Das ist aber eine Definitionsfrage des Aufgabenstellers.

Also schau dir mal date an. Wenn du GNU date hast, hast du schon gewonnen. ;)

Hier noch ein Link für eine sehr gute Einführung in die bash (hab gleich zu if then else verlinkt.)
bashbefehle

Gruß Wolfgang
 
Hallo also ich habe hier mal die Shell, habe aber noch ein paar kleine Fragen. Habe es immer etwas leiner dahinter geschrieben.

#!/bin/bash

if [ lastlog -t 90 ]; then Ich weis hier nicht wie ich die Bedingung schreiben muss.
#Uberprufung, welcher Benutzer in den letzten 90 Tagen angemeldet war

#Eintragen der User in Liste1Wie trage ich etwas in eine Liste ein? Ich weis leider nicht wie man einen Array benutzt. Die Seite die du mir gegeben hast ist gut. Habe aber dort nichts zu einen Array an.

elif [ lastlog -t 180 ]; then
#Uberprufung, welcher Beuntzer in den letzten 180 Tagen angemeldet war

#Eintagen der User in Liste2

elif [ lastlog -t 365 ]; then
#Uberprufung, welcher Benutzer in den letzen 365 Tagen angemeldet war

#Eintragen der User in Liste3

fi

#Abarbeiten der Liste1
#User eine Mitteilung schicken
MODT_FILEWie wahle ich denn hier die User wieder aus, die in der Liste sind und wie benutze ich den diesen Befehl.

#Abarbeiten der Liste2
#User eine E-Mail schicken
Mail user

#Abarbeiten der Liste3
userdel -m user




Wenn ihr sonst noch irgend wo einen Fehler findet, dann teilt es mir bitte mit.

Danke
 
Hallo

Du hast hier keine Shell, sondern Codefragmente für ein Skript.
Wie ich sehe, fehlen dir aber wirklich essentielle Grundlagen, was du nachholen solltest. Sonst wirst du diese Aufgabe definitiv nicht lösen können.

Ein fertiges Skript würde dir insofern auch nix bringen, da du nicht verstehen würdest was da passiert.
Also schau dir erstmal die Variablentypen an.
Schau dir an, wie du mit Returnwerten von Befehlen umgehst.
Schau dir an, wie du über eine datei iterierst und die Eingabe bearbeitest.
Schau dir die Verwendung von grep an.
Das finsdest du übrigens alles in den von mir gegebenen Link sehr ausführlich.
Du musst dir halt die Zeit nehmen.

Kleines Beispiel wie ich eine Datei einlese und das Ergebnis auswerte.
Hier lese ich alle user aus der /etc/passwd ein und gebe den user in die Datei userliste aus.
while read u
do
echo $u|cut -d: -f1
done</etc/passwd >userliste

Du musst also die Ausgabe von lastlog nach den usern durchsuchen.

Ich gebe dir mal noch einen Schnellschuss, der die halbe Arbeit macht.
Aber er wird dir erst etwas nützen, wenn du verstehst was da passiert.
Code:
while read  line ;
 do
 U="$(echo $line|cut -d: -f1)";
   if [ "$(lastlog -t90|grep "$U")" ];
   then
   echo "$U war vor 90 Tagen hier";
   continue;
   elif [ "$(lastlog -t120|grep "$U")" ];
   then
   echo "$U war vor 120 Tagen hier";
   continue;
   else   
   echo "$U war schon lange nicht hier";
   fi;
done</etc/passwd

Verstehen kannst du das, wenn du dir mal die man :rtfm: zu den verwendeten Befehlen durchschaust.
Tipp:
Achte auf das continue, was weitere Abfragen unterbindet wenn die erste bedingung erfüllt ist und die nächste Runde einleitet.
Noch ein Tipp:
echo "Ich bin gleich in Datei liste1">>liste1
Schreibt den Text in Datei liste1
;)
Gruß Wolfgang
 
Hi. Danke Wolfgang du bist der Beste.

Also ich habe die Shell mal zuende gebracht.

#!/bin/bash

echo "Hallo. Sie waren lang nicht mehr angemeldet!">>Ermahnung;

while read line ;
do
U="$(echo $line|cut -d: -f1)";
if [ "$(lastlog -t90|grep "$U")" ];
then
echo "$U war in den letzten 90 Tagen hier!";
wall Ermahnung;
continue;
elif [ "$(lastlog -t180|grep "$U")" ];
then
echo "$U war in den letzten 180 Tagen hier!";
mail -s "Hallo sie waren zuletzt eingeloggt am :" lastlog -u $U "Bitte aendern Sie ihr Passwort."
continue;
elif [ "$(lastlog -t365|grep "$U")" ];
then
echo "$U war in den letzten 365 Tagen hier!";
userdel -r $U
continue;
else
echo "$U war noch nie hier!";
fi;
done</etc/passwd

rm Ermahnung

Ich fuehre mir heute abend nochmal die komplette Bashanleitung, die du mir gegeben hast zu Gemuehte.

Ich ueberpruefe es heute abend nochmal zu Hause, denn hier hab ich nur DSL(Damn Small Linux) und das kennt nicht alle Befehle.

Falls Ihr noch einen Fehler findet, teilt ihn mir bitte mit.

Danke
 

Ähnliche Themen

./easy-wi_install.sh install Script

Alternative zu Ubuntu gesucht + Mängelliste

Windows clients können nicht mehr auf lange laufendes System zugreifen

OpenVPN Ports für Anwendungen weiterleiten?

Doppelte Dateien löschen.

Zurück
Oben