PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Benutzer aus einer *.cvs datei mit Benutzer aus /etc/passwd vergl. neue einfüge...?



Roki
07-08-2009, 19:44
Hallo,

ich arbeite an einer schule mit ca. 2000 Schüler.
Die Schüler müssen sich beim Webzgriff Authentifizieren (Captiv Portal....Proxyserver). Zum beginn des neuen Schuljahres, müssen die "alten" Zugangsdaten in der passwd gelöscht werden, und die "neuen" hinzugefügt werden.

Die neue Benutzernamen-Schüler-liste existiert in einer *.cvs Datei, die so aussieht:

vorname1.name1 passwort
vorname2.name2 passwort
vorname3.name3 passwort
...
...
vorname.name [TAB] passwort
die *.cvs Datei ist aktuell bzw. ohne "alte" Schüler.

Ich bin auf der suche nach eine Möglichkeit um *.cvs Inhalt mit passwd zu vergleichen, die vorhandene:

vorname.name:verschlüsselterpasswort
:in passwd zu ignorieren (nicht zu verändern) und die fehlende zu importieren bzw. hinzuzufügen.

Wenn ein Benutzer in passwd nicht existiert, dann dies einfügen und gleich den gewünschte *Benutzername [TAB] Passwort* aus der *.cvs mit htpasswd befehl in passwd übernehmen.

dieser befehl:

sed -r 's#(.+) (.+)#htpasswd -b /var/ipcop/proxy/advanced/ncsa/passwd \1 \2#' datei.cvs | sh
überschreibt alles in passwd und die "alten" werden nicht gelöscht. Jetzt weiß ich nicht wie ich das ganze am bestens verknüpfen kann? :confused:

Danke im voraus für Antwort
MfG, Roki

jeebee
08-08-2009, 15:15
Hi Roki,

Hab mal was zusammengebaut:
#!/bin/sh

passwd_file=$1
data_file=$2

for p in `sed -r 's#(.+)\t(.+)#\1:\2#' $data_file`; do
name=${p%:*}
passwd=${p#*:}
if [ ! `grep $name $passwd_file` ]; then
htpasswd -b $passwd_file $name $passwd
fi
done

for p in `grep -oP '(.+?:)' $passwd_file`; do
name=${p%:}
grep $name $data_file >/dev/null
if [ $? -eq 1 ]; then
htpasswd -D $passwd_file $name
fi
done

Verwenden kannst du das wie folgt (angenommen du speicherst das Skript als updater.sh im aktuellen Verzeichnis und die neuen Daten sind in data.cvs gespeichert):
./updater.sh /var/ipcop/proxy/advanced/ncsa/passwd data.cvs

HTH jeebee

Roki
08-08-2009, 23:30
Hallo Jeebee :)

Danke! aber irgend wie klappt es nicht :confused:
ich versuche dies mal deutlicher zu erklären ;)

alte_liste.cvs sieht so aus:

"vorname.name1" "passwort"
"vorname.name2" "passwort"
"vorname.name3" "passwort"
"vorname.name4" "passwort"
"v.name5" "passwort"
"v.name6" "passwort"
"v.name7" "passwort"
"vorname.name-doppelname8" "passwort"
"vorname.name-doppelname9" "passwort"
"vorname.name-doppelname10" "passwort"
(mit Gänsefüßchen)

mit diesem befehl:

sed -r 's#(.+) (.+)#htpasswd -b passwd \1 \2#' alte_liste.cvs | sh
werden alle Benutzer auf einmal in passwd eingetragen:

Adding password for user vorname.name1
Adding password for user vorname.name2
Adding password for user vorname.name3
Adding password for user vorname.name4
Adding password for user v.name5
Adding password for user v.name6
Adding password for user v.name7
Adding password for user vorname.name-duppelname8
Adding password for user vorname.name-doppelname9
Adding password for user vorname.name-doppelname10

neue_liste.cvs sieht so aus:


"vorname.name2" "passwort"
"vorname.name3" "passwort"
"vorname.name4" "passwort"
"v.name5" "passwort"
"v.name6" "passwort"
"v.name7" "passwort"
"vorname.name-doppelname8" "passwort"
"vorname.name-doppelname9" "passwort"
"vorname.name11" "passwort"
"vorname.name12" "passwort"

1. wie man sieht fehlen

"vorname.name1" "passwort"
"vorname.name-doppelname10" "passwort"

2. es gibt zusätzliche

"vorname.name11" "passwort"
"vorname.name12" "passwort"

3. und auch noch bereits existierenden

"vorname.name2" "passwort"
"vorname.name3" "passwort"
"vorname.name4" "passwort"
"v.name5" "passwort"
"v.name6" "passwort"
"v.name7" "passwort"
"vorname.name-doppelname8" "passwort"
"vorname.name-doppelname9" "passwort"

die funktion die ich suche ist, das in passwd die fehlende gelöscht werden und die zusätzlichen hinzugefügt werden. Die bereits existierenden sollen unverändert bleiben :confused:

wenn ich dein Script aufrufe:

./update.sh passwd neue_liste.cvs
Adding password for user "vorname.name2"
Adding password for user "passwort"
Adding password for user "vorname.name3"
Adding password for user "vorname.name4"
Adding password for user "v.name5"
Adding password for user "v.name6"
Adding password for user "v.name7"
Adding password for user "vorname.name-doppelname8"
Adding password for user "vorname.name-doppelname9"
Adding password for user "vorname.name11"
Adding password for user "vorname.name12"
grep: The -P option is not supported


passwd sieht dann so aus:

vorname.name1:khsm6UMzyU7t2
vorname.name2:khsm6UMzyU7t2
vorname.name3:khsm6UMzyU7t2
vorname.name4:khsm6UMzyU7t2
v.name5:khsm6UMzyU7t2
v.name6:khsm6UMzyU7t2
v.name7:khsm6UMzyU7t2
vorname.name-duppelname8:khsm6UMzyU7t2
vorname.name-doppelname9:khsm6UMzyU7t2
vorname.name-doppelname10:khsm6UMzyU7t2
"vorname.name2":tc4R3mRS1JtUY
"passwort":tcrXFyVTuYzBY
"vorname.name3":tc4R3mRS1JtUY
"vorname.name4":tc4R3mRS1JtUY
"v.name5":tcswNElzwAQdk
"v.name6":tcVqbDNJVBHQQ
"v.name7":tcobg/5eNpyCs
"vorname.name-doppelname8":tc4R3mRS1JtUY
"vorname.name-doppelname9":tc4R3mRS1JtUY
"vorname.name11":tc4R3mRS1JtUY
"vorname.name12":tc4R3mRS1JtUY
???

Ich hoffe das es nicht zu kompliziert und schwer ist...? (für mich alles chinesisch... :confused: )

Gruss, Roki

jeebee
09-08-2009, 09:23
Ein Problem ist, dass grep auf deinem System die -P Option nicht unterstützt.
Ein anderes ist, dass du bisher nicht erwähnt hast, dass die Namen und Passwörter in " eingeschlossen sind.

Versuch mal folgendes:
#!/bin/sh

passwd_file=$1
data_file=$2

for p in `sed -r 's#"(.+)"\t"(.+)"#\1:\2#' $data_file`; do
name=${p%:*}
passwd=${p#*:}
if [ ! `grep $name $passwd_file` ]; then
htpasswd -b $passwd_file $name $passwd
fi
done

for p in `sed -r 's#(.+):(.+)#\1#' $passwd_file`; do
name=${p%:}
grep "\"$name\"" $data_file >/dev/null
if [ $? -eq 1 ]; then
htpasswd -D $passwd_file $name
fi
done

Roki
09-08-2009, 10:56
Hallo Jeebee,

das Problem ist, das ich die *.cvs liste letztens ohne " erhalten habe, dies mal aber mit " :confused:

dies mal passiert folgendes:


./update.sh passwd neue_liste.cvs
Adding password for user "vorname.name2"
Adding password for user "passwort"
Adding password for user "vorname.name3"
Adding password for user "vorname.name4"
Adding password for user "v.name5"
Adding password for user "v.name6"
Adding password for user "v.name7"
Adding password for user "vorname.name-doppelname8"
Adding password for user "vorname.name-doppelname9"
Adding password for user "vorname.name11"
Adding password for user "vorname.name12"
Usage:
htpasswd [-cmdps] passwordfile username
htpasswd -b[cmdps] passwordfile username password

htpasswd -n[mdps] username
htpasswd -nb[mdps] username password
-c Create a new file.
-n Don't update file; display results on stdout.
-m Force MD5 encryption of the password.
-d Force CRYPT encryption of the password (default).
-p Do not encrypt the password (plaintext).
-s Force SHA encryption of the password.
-b Use the password from the command line rather than prompting for it.
On Windows, TPF and NetWare systems the '-m' flag is used by default.
On all other systems, the '-p' flag will probably not work.
Usage:
htpasswd [-cmdps] passwordfile username
htpasswd -b[cmdps] passwordfile username password

htpasswd -n[mdps] username
htpasswd -nb[mdps] username password
-c Create a new file.
-n Don't update file; display results on stdout.
-m Force MD5 encryption of the password.
-d Force CRYPT encryption of the password (default).
-p Do not encrypt the password (plaintext).
-s Force SHA encryption of the password.
-b Use the password from the command line rather than prompting for it.
On Windows, TPF and NetWare systems the '-m' flag is used by default.
On all other systems, the '-p' flag will probably not work.
Usage:
htpasswd [-cmdps] passwordfile username
htpasswd -b[cmdps] passwordfile username password

htpasswd -n[mdps] username
htpasswd -nb[mdps] username password
-c Create a new file.
-n Don't update file; display results on stdout.
-m Force MD5 encryption of the password.
-d Force CRYPT encryption of the password (default).
-p Do not encrypt the password (plaintext).
-s Force SHA encryption of the password.
-b Use the password from the command line rather than prompting for it.
On Windows, TPF and NetWare systems the '-m' flag is used by default.
On all other systems, the '-p' flag will probably not work.
Usage:
htpasswd [-cmdps] passwordfile username
htpasswd -b[cmdps] passwordfile username password

htpasswd -n[mdps] username
htpasswd -nb[mdps] username password
-c Create a new file.
-n Don't update file; display results on stdout.
-m Force MD5 encryption of the password.
-d Force CRYPT encryption of the password (default).
-p Do not encrypt the password (plaintext).
-s Force SHA encryption of the password.
-b Use the password from the command line rather than prompting for it.
On Windows, TPF and NetWare systems the '-m' flag is used by default.


so neben bei gefragt, welche buch empfehlst Du mir um shell scripten zu lernen. :)

Gruss, Roki

jeebee
09-08-2009, 14:57
Buch: Zum Beispiel: Classic Shell Scripting von O'Reilly (http://www.oreilly.de/catalog/9780596005955/) (gibts auch auf Deutsch...)

Weiteres Problem: Dein htpasswd-Befehl versteht die Option -D (User löschen) nicht.

Neue Skript-Version:
#!/bin/sh

passwd_file=$1
data_file=$2

if [ ! -e $passwd_file ]; then touch $passwd_file; fi

for p in `sed -r 's#"(.+)"\t"(.+)"#\1:\2#' $data_file`; do
name=${p%:*}
passwd=${p#*:}
if [ ! `grep $name $passwd_file` ]; then
htpasswd -b $passwd_file $name $passwd
fi
done

for p in `sed -r 's#(.+):(.+)#\1#' $passwd_file`; do
name=${p%:}
grep "\"$name\"" $data_file >/dev/null
if [ $? -eq 1 ]; then
# as htpasswd apparently does not have the -D switch everywhere
# delete old users in another way.
echo "Deleting password for user $name"
grep -v "$name:" $passwd_file > $passwd_file.$$
mv $passwd_file.$$ $passwd_file
fi
done

Ach ja: die Ausgabe die du gepostet hast sieht immer noch falsch aus... Hast du die neue Variante des Skripts kopiert oder hast du es von Hand angepasst? Wenn von Hand, hast du die " im ersten Sed-Befehl hinzugefügt?

Gruss, jeebee

Roki
09-08-2009, 20:55
Hallo Jeebee,

Skript v3
./update.sh passwd neue_liste.cvs

Adding password for user "vorname.name2"
Adding password for user "passwort"
Adding password for user "vorname.name3"
Adding password for user "vorname.name4"
Adding password for user "v.name5"
Adding password for user "v.name6"
Adding password for user "v.name7"
Adding password for user "vorname.name-doppelname8"
Adding password for user "vorname.name-doppelname9"
Adding password for user "vorname.name11"
Adding password for user "vorname.name12"
Deleting password for user vorname.name1
Deleting password for user vorname.name-duppelname8
Deleting password for user vorname.name-doppelname10
Deleting password for user "vorname.name2"
Deleting password for user "passwort"
Deleting password for user "vorname.name3"
Deleting password for user "vorname.name4"
Deleting password for user "v.name5"
Deleting password for user "v.name6"
Deleting password for user "v.name7"
Deleting password for user "vorname.name-doppelname8"
Deleting password for user "vorname.name-doppelname9"
Deleting password for user "vorname.name11"
Deleting password for user "vorname.name12"

dieser Script funktioniert diesmal besser, nur noch:

Deleting password for user "vorname.name11"
Deleting password for user "vorname.name12"
werden aus neue_liste.cvs nicht übernommen...?
passwd sieht so aus:

vorname.name2:CeiYNCqMCZRXY
vorname.name3:CeiYNCqMCZRXY
vorname.name4:CeiYNCqMCZRXY
v.name5:CeiYNCqMCZRXY
v.name6:CeiYNCqMCZRXY
v.name7:CeiYNCqMCZRXY
vorname.name-doppelname9:CeiYNCqMCZRXY


Hast du die neue Variante des Skripts kopiert oder hast du es von Hand angepasst? Wenn von Hand, hast du die " im ersten Sed-Befehl hinzugefügt?
ich habe dein Skript kopiert und in leere update.sh eingefügt..?


Buch: Zum Beispiel: Classic Shell Scripting von O'Reilly (gibts auch auf Deutsch...)

ich werde mir diese Buch bald kaufen. :)

Gruss, Roki

jeebee
09-08-2009, 21:25
Ich hab das Gefühl deine Daten sind nicht so formatiert wie du sagst... Die Ausgabe sollte so aussehen (mit den Daten die du in Post #3 angegeben hast, einfach die Leerzeichen mit TAB ersetzt):
1. Einfügen:
Adding password for user vorname.name1
Adding password for user vorname.name2
Adding password for user vorname.name3
Adding password for user vorname.name4
Adding password for user v.name5
Adding password for user v.name6
Adding password for user v.name7
Adding password for user vorname.name-doppelname8
Adding password for user vorname.name-doppelname9
Adding password for user vorname.name-doppelname10

2. Update:
Adding password for user vorname.name11
Adding password for user vorname.name12
Deleting password for user vorname.name1
Deleting password for user vorname.name-doppelname10

Danach sieht die passwd-Datei so aus:
vorname.name2:iq9ooR9.DMSQc
vorname.name3:jaW090gH0KWmI
vorname.name4:C5Zf5bDr6dRBI
v.name5:tgXKvdcbjcIEk
v.name6:gXO4.OQQVJsb2
v.name7:Tby/mO7aEjW5I
vorname.name-doppelname8:LX8tMGqziNpLc
vorname.name-doppelname9:iiDr.aQmS8fDE
vorname.name11:ooYQjF7O23.G.
vorname.name12:atpb7nXKfU9Qk

Gruss, jeebee

Roki
09-08-2009, 23:40
Jeebee Du hast recht!
ich habe die ganze Zeit per ssh direkt auf ipcop deine Skripte getestet, diesmal habe ich dein Skript auf Debian Lenny laufen lassen und es tut das was ich mir erhofft habe. Vielen Dank! :)
Ich hoffe das ich bald hier mit helfen kann. Was meinst Du wie soll ich am bestens Anfangen zu lernen? Ziel setzen? und versuchen zu erfühlen? Wie hast Du angefangen?

Gruss, Roki

jeebee
10-08-2009, 09:52
Was für 'ne ipcop Version hast du denn?

Eine Variante anzufangen wäre, mein Skript zu nehmen und es zu verstehen.

Roki
10-08-2009, 22:15
Hallo Jeebee,

IPCop 1.4.21 released
http://www.ipcop.org/

add-ons:
http://www.advproxy.net/
http://www.urlfilter.net/

Gruss, Roki

jeebee
11-08-2009, 10:34
Hmm, ok. Ich hab mir gestern mal noch ein IPCop 1.4.20 installiert und dort getestet. Bei mir sah das ganze ok aus.

Gruss, jeebee