Zum Inhalt springen

Wieder einmal Bash-Scripting mit tausenden Benutzern...


van_haakonnen

Empfohlene Beiträge

Hallo,

ich habe wieder einmal eine Frage an euch:

Zwei Dateien habe ich gegebe...

Eine nach folgendem Muster:

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

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

Eine weitere mit folgendem Inhalt:

y0xxxxxxx@server1.firma.de

y0yyyyyy@server2.firma.de

Jetzt bestand die Aufgabe zunächst darin aus der ersten Datei alle User herauszusuchen deren Passwort z.B. 356 Tage abgelaufen ist. Dies habe ich wiefolgt gelößt:

#!/bin/bash

#Variablen
FILE=check_abgel.01-01-06;
OFILE=output.txt;
I=$365;

#Verarbeitung
while read USER adummy bdummy T Rest ;
do
if [ $T -gt $I ] ;
then
echo "$USER"|tr -d ":";
fi;
done <"$FILE" >"$OFILE"
echo "All done";
[/PHP]

Die abgelaufenden Benutzernamen werden also untereinander in die Datei output.txt geschrieben.

Jetzt muss ich die BEnutzernamen noch den korrekten Server zuweisen. Ich habe mir also gedacht zunächst einfach die Liste output.txt durchzugehen und dann jeweils einfach den richtigen Server dahinterzuschreiben.

So das, dass ganze am Ende so aussieht:

y0yyyyyy server1.firma.de

y0xxxxxxx server2.firma.de

henning server3.firma.de

Das soll also in einer neuen Datei stehen.

Aus dieser neuen Datei müssen dann für jeden Server zwei Textdateien erzeugt werden. EInmal mit den Benutzern deren Accounts mit y0 beginnen und dann eine zweite Datei mit allen anderen. Das Prozesere für jeden Server der gefunden wird.

Aber wie setzte ich das um?

Ich wäre euch sehr dankbar für konkrete Codebeispiele weil ich nicht wirklich Ahnung habe... :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aus dieser neuen Datei müssen dann für jeden Server zwei Textdateien erzeugt werden. EInmal mit den Benutzern deren Accounts mit y0 beginnen und dann eine zweite Datei mit allen anderen. Das Prozesere für jeden Server der gefunden wird.


grep ^y0 output.txt > output_1.txt

grep -v ^y0 output.txt > output_2.txt

Mit der ersten Zeile wird output.txt nach allen Zeilen durchsucht, die mit y0 beginnen (deswegen das Dachzeichen), und das Suchergebnis nach output_1.txt geschrieben.

Mit der zweiten Zeile wird nach allen Zeilen gesucht, die nicht (-v) mit y0 anfangen gesucht und nach output_2.txt geschrieben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jawoll - vielen dank! :)

Also ein bisschen was habe ich auch schon herausbekommen:

Das zuordnen der Benutzer zu den korrekten Server kann man so machen:

#!/bin/bash

#Zuordnung der Server zu den einzelnen Useraccounts

#Variablen
FILE=output.txt
OFILE=outputsort.txt
popmap=/home/Script2/popmap

#Verarbeitung
while read USER Rest ;
do
grep $USER $popmap;

done <"$FILE" >"$OFILE"
echo "All done";
[/PHP]

Damit erhalte ich dann in der Datei outputsort.txt alle User deren Passwort seit X - Tagen abgelaufen ist mit dem dazugehörigen Server.

Das ganze sieht in der Datei outputsort.txt so aus:

[email]henning@server1.firma.de[/email]

[email]y0873742@server2.firma.de[/email]

[email]y0344543@server2.firma.de[/email]

[email]gaus@server1.firma.de[/email]

[email]markus@server3.firma.de[/email]

[email]y0978832@server4.firma.de[/email]

Damit habe ich schonmal alles in einer Datei. Jetzt habe ich deine Idee befolgt und die Y-Nummern von den anderen Usern getrennt:

Also entstanden zwei Dateien nach folgendem Script:

[PHP]#!/bin/bash

#Variablen
FILE=outputsort.txt

#Programmcode
grep ^y0 outputsort.txt > output_y.txt
grep -v ^y0 outputsort.txt > output_sonst.txt

exit 0

Dieses Script muss aber noch um etwas erweitert werden. oder einfach ein neues geschrieben...

Das ist jetzt mein größtes Problem... :(

Ich muss jetzt für jeden Server der dort auftaucht beide Ausgaben in Form von Y-nummern und anderen Benutzern erstellen.

Hierfür müssen also die output_y.txt und output_sonst.txt durchgegangen werden und dann sollen am Ende Dateien entstehen die z.B. wie folgt aussehen:

server01.firma.de_Y-Nummern.txt sowie server01.firma.de_Andere.txt

server01.firma.de_Y-Nummern.txt sowie server02.firma.de_Andere.txt

In den Dateien können die User ruhig wieder in der Form stehen, wie sie auch in der outputsort.txt zu finden sind.

Könnt ihr mir dabei helfen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ich es richtig verstanden habe, gibt es auf der einen Seite eine bestimmte Anzahl von Servern, deren Namen bekannt sind. Auf der anderen Seite gibt es zwei Arten von Usern - solche, die mit y0 beginnen und solche, die nicht mit y0 beginnen. Dann würde ich einfach ein Textdatei serverliste.txt erstellen, wo in jeder Zeile ein Server aufgeführt wird. Zusätzlich existiert die Datei output.txt in der ursprünglichen Form (ohne die Trennung zwischen y0 und nicht-y0). Dann bietet sich das folgende Skript an:


#!/bin/bash

while read i

do

   grep $i output.txt | grep ^y0 > ${i}_Y-Nummern.txt

   grep $i output.txt | grep -v ^y0 > ${i}_Andere.txt

done < serverlist.txt

Hier wird die Datei serverlist.txt sequentiell gelesen und jedes Element (respektive jeder Server) einmal als Schleifenvariable gesetzt. Dann wird output.txt nach Zeilen mit dem Vorkommen den jeweiligen Servernamen durchsucht, und diese Ergebnisse dann nochmal nach y0- und nicht-y0-Usern. Die Ergebnisse werden dann in Dateien, die nach Servernamen und Benutzertyp benannt sind, gespeichert.

Sorry, wenn das jetzt etwas unverständlich ist, ich hab das fünfte Bier in Arbeit ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

juhu - das funktioniert problemlos. Habe noch etwas modifiziert aber ganz wunderbar.

Eine Sache ist mir dann doch noch aufgefallen.

Ich glaube es ist besser, wenn in den Enddateien nur noch die Usernamen bzw. Y0-Nummern stehen. Also nicht mehr mit dem entsprechenden Server durch das @ dahinter... wobei es egal ist... naja... ich weiß nicht ob es leichter ist wenn man so weiterarbetiet...

also eine einzige Sache muss das Script oder ein weiteres jetzt noch machen:

Es soll mittels eine "du" - Befehls auf den jeweiligen Servern nachgesehen werden wieviel Speicher die User belegen. Jeder User hat dort also einen festen Pfad und einen Ordner der so heißt wie sein Username.

Also ich denke man müsse dafür den "du -sb" Befehl verwenden.

Also der Server auf dem das Script ausgeführt wird ist berechtigt auf die anderen Zuzugreifen.

Nur wie schreibe ich die Schleife, damit hinter jedem User jetzt in den alten Ausgabedateien Servername_Y-Nummern.txt und Servername_Andere.txt auch noch der verwendete Speicherplatz steht?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ohne das jetzt getestet zu haben, hier eine quick-and-dirty-Lösung, die aus der ürsprünglichen Liste serverlist.txt erst mal eine solche mit verbratenem Plattenplatz (in kB) im Format USERNAME:RECHNERNAME:PLATTENPLATZ schreibt (serverliste_2.txt), und dann die Trennung nach y0 und andere vornimmt.


#!/bin/bash


while read i

do

   USERNAME=$(echo $i|cut -d'@' -f1)

   REMOTE_HOST=$(echo $i|cut -d'@' -f2)

   echo "$USERNAME:$REMOTE_HOST:$(remsh $REMOTE_HOST du -sk /pfad/$USERNAME|awk '{print $1}')" >> serverlist_2.txt

done < serverlist.txt


while read i

do

   USERNAME=$(echo $i|cut -d':' -f1)

   REMOTE_HOST=$(echo $i|cut -d':' -f2)

   DISK_SPACE=$(echo $i|cut -d':' -f3)

   if [ "$(echo $USERNAME | cut -b1,2)" = "y0" ]

   then

       echo "$USERNAME $DISK_SPACE" >> ${REMOTE_HOST}_Y-Nummern.txt

   else

       echo "$USERNAME $DISK_SPACE" >> ${REMOTE_HOST}_andere.txt

   fi

done < serverlist_2.txt

PS: Wenn das hier funktionieren sollte, schuldest du mir ein Bier ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@cane: Kann schon sein, dass es einfacher wäre. Eine Datenbank will aber auch gepflegt/gewartet sein. Und LDAP kostet Geld. Ich sehe nicht, wie Sie hier konstruktiv zur Behebung des von van_haakonnen geschilderten Problems beitragen/beigetragen haben. Stellen Sie doch mal Ihre Lösungen vor. Mit dem Einwerfen von Buzzwords (hach, ich liebe Anglizismen) ist keinem geholfen.

Bitte nicht falsch verstehen, aber wenn das Kind in den Brunnen gefallen ist, hilft es wenig, aufzuzeigen, was in der Vergangenheit hätte anders laufen können. Just my $0,02

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bitte nicht falsch verstehen, aber wenn das Kind in den Brunnen gefallen ist, hilft es wenig, aufzuzeigen, was in der Vergangenheit hätte anders laufen können.

Wo ist da was in den Brunnen gefallen?

Außerdem möchte ich nur eine eventuell bessere, alternative Lösung für die Zukunft vorschlagen...

@cane: Kann schon sein, dass es einfacher wäre. Eine Datenbank will aber auch gepflegt/gewartet sein.

Ist aber einfacher zu warten als der jetzige Zustand, LDAP ist IMO noch geeigneter.

Und LDAP kostet Geld.

Unsinn - alle bekannteren Server-Dienste in OpenSource Betriebssystemen können mittlerweile per LDAP authentifizieren oder Daten aus dem LDAP ziehen. Außerdem ist LDAP keine Software sondern ein Protokoll, eine vereinfachte, weniger strikte Ableitung von X500...

Die bekannteste Implementierung des LDAP-Verzeichnisdienstes ist OpenLDAP.

Ich sehe nicht, wie Sie hier konstruktiv zur Behebung des von van_haakonnen geschilderten Problems beitragen/beigetragen haben.

Eine eventuell besser geeignete Alternative ist immer konstruktive Kritik am jetzigen Zustand. Brille aufsetzen ;)

Stellen Sie doch mal Ihre Lösungen vor. Mit dem Einwerfen von Buzzwords (hach, ich liebe Anglizismen) ist keinem geholfen.

Mein Squid-Proxy im Unternehmen authentifiziert User die Internnetzugriff versuchen per NTLM-Auth am ActiveDirectory (ist ja ein LDAP) und kann wenn gewünscht auch gruppenbasiert agieren.

Mein OpenXchange Server (OX) lagert sämtliche Adressbücher, Kontakte und Logins in LDAP, kann ich so einfach in meinen MUA (Thunderbird) einbinden da dieser LDAP-fähig ist.

Ein Freund entwickelt den OX mit und kann Implementierungen > 10.000 User über verteilte Standorte vorweisen. O.g. Dinge wie Kontakte lagern wie immer im LDAP. Der Bundestag setzt auch LDAP ein...

Für SingleSignOn ist LDAP momentan das geeignetste Protokoll da von vielen Diensten unterstützt.

mfg

cane

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wo ist da was in den Brunnen gefallen?

Außerdem möchte ich nur eine eventuell bessere, alternative Lösung für die Zukunft vorschlagen...

Richtig - eine Lösung für die Zukunft. Trotzdem ändert das nichts am aktuellen Problem.

Unsinn - alle bekannteren Server-Dienste in OpenSource Betriebssystemen können mittlerweile per LDAP authentifizieren oder Daten aus dem LDAP ziehen. Außerdem ist LDAP keine Software sondern ein Protokoll, eine vereinfachte, weniger strikte Ableitung von X500...

Die bekannteste Implementierung des LDAP-Verzeichnisdienstes ist OpenLDAP.

Ich sehe immer noch nicht, warum (Open)LDAP nichts kosten sollte. Ich brauche nunmal Software, um darauf zuzugreifen. Und jetzt kommt der springende Punkt: bei OpenSource kann jeder am Code rumfrickeln - aber so richtig verantwortlich (im Sinne von haftbar) ist keiner. Heisst also, ich laufe in einen Bug, und kriege ihn nicht oder nur mit großer Verzögerung behoben. So etwas kann ich im produktiven Umfeld nicht einsetzen. Also bin ich auf (externen) Support, den ich bezahlen muss.

Eine eventuell besser geeignete Alternative ist immer konstruktive Kritik am jetzigen Zustand.

Schlagworte sind in meinen Augen erstmal keine Alternative. Aber ich kann ja immer noch nachfragen, und wenn dann wie jetzt geschehen was konstruktives bei rumkommt...

Brille aufsetzen ;)

Das finde ich gar nicht lustig. Für meine Sehbehinderung kann ich nichts. :(

Mein Squid-Proxy im Unternehmen authentifiziert User die Internnetzugriff versuchen per NTLM-Auth ...

Ab hier hab ich kaum etwas verstanden. Muss ich auch nicht, ist nicht mein Fachgebiet, aber so in etwa stelle ich mir konstruktive Vorschläge vor.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich sehe immer noch nicht, warum (Open)LDAP nichts kosten sollte. Ich brauche nunmal Software, um darauf zuzugreifen.

Software um drauf zuzugreifen? Also ich kann dir nicht folgen... Die meiste Serversoftware die mit vielen Usern arbeitet hat LDAP-Support integriert, also keine Zusatzkosten.

Und jetzt kommt der springende Punkt: bei OpenSource kann jeder am Code rumfrickeln - aber so richtig verantwortlich (im Sinne von haftbar) ist keiner.

Du redest viel Unsinn. Seit wann kann jeder mitcoden? ich kenne das nur so das man Patches beim zuständigen Maintener einreicht und dieser entscheidet. Und wer haftet bei kommerzieller Software bitte? Windows und SCO-Unix haben viele bekannte Bugs und es wird nichts geändert - wer haftet da bitte?

Heisst also, ich laufe in einen Bug, und kriege ihn nicht oder nur mit großer Verzögerung behoben. So etwas kann ich im produktiven Umfeld nicht einsetzen.

Wieder Unsinn, Bugs in OpenSource Produken werden regelmäßig schneller entdeckt und behoben.

Also bin ich auf (externen) Support, den ich bezahlen muss

Wenn Du keine eigenen Kompetenzen im Bereich eines Anwendungsgebiet hast bist Du audf Suppotrt angewiesen egal ob Du Closed- oder Open-Source einsetzt...

mfgc

cane

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich halte mich aus der Diskussion jetzt auch mal raus...

ich kann nur soviel dazu sagen:

Es handelt sich hierbei um ein System mit tausenden bzw. zehntausenden Benutzern. Diese sind eigentlich auch in einer Datenbank gespeichert. Jedoch ist dies alles etwas zu groß und zu komplex. Hier werden nicht nur Webspace, AFS-Speicherplatz, Mail-Adressen, Druckkonten, etc. zur Verfügung gestellt sondern noch vieles mehr...

Die eigentliche Verwaltung der benutzer findet also in Datenbanken statt. Es wird auch eine LDAP Schnittstelle angeboten... als eine Schnittstelle von vielen...

Meine Dateien die ich hier bekommen habe sind durch Cronjobs aus dem Mailsystem (welches wiederrum mit dem Datenbanksystem zusammenhängt) ausgelesen. Warum ich nicht direkt in der DB arbeiten darf, kann ich hier nicht offen legen.

Also einfach mal was umstellen ist da nicht ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann passts ja :)

Kannst ja mal Fragen ob Du nen DB-User / LDAP-Account bekommst der dann halt nur für "deinen" Bereich gilt oder vielleicht zumindest nen View auf ein paar tables bekommst.

Würde deine Arbeit ja wesentlich erleichtern...

Good Luck :-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

hmhmhm... also irgenendwie gehts noch nicht so unbedingt...

ich habe jetzt in der Datei serverlist2.txt folgenden Inhalt stehen:

server1.firma.de:server1.firma.de:

server2.firma.de:server1.firma.de:

server3.firma.de:server1.firma.de:

[...]

das ganze für jeden Server drei Mal...

Also es fehlen die User und der Speicherplatz...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmmmm, bei mir funktioniert das ohne Probleme. Vor jedem Durchlauf müssen die output-Dateien gelöscht werden, da immer hintendran geschrieben wird.

Das Ausgangsformat ist wirklich username@rechner? Lässt sich mit dem Rechnernamen, wie er dort steht, remote Shell aufrufen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich hab da überall jetzt totalen Schwachsinn und steige nicht mehr durch...

Kannst du mir mal deine Mail - Addy geben? Dann schicke ich dir mal alles was ich jetzt habe... :)

Also remsh funktioniert definitiv auf einem der rechner. die anderen sind nicht freigeschaltet auf meinen usernamen. aber auf einem Server sollte es klappen. Tuts aber auch nicht... also von Hand komme ich drauf auf den Server...

Ich habe es jetzt mal durchlaufen lassen...

Auch in den Output - Daten steht unsinn.... wenn ich server01.firma.de z.b. öffne dann steht da das gleiche nochmal 10 mal drin...

komisch...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...