# Python: Script zum User anlegen



## Gadget2 (11. August 2013)

Hab die Aufgabe bekommen, ein Script zu schreiben, dass aus einer CSV-Datei unter Linux User und Gruppen anlegen kann.

Da ich nichts besseres gefunden habe, habe ich mir zum testen meine CSV-Datei in der Form von der /etc/passwd gebastelt.

Auf Funktion getestet ist jetzt bereits:



Spoiler





```
[B][COLOR="red"]#!/usr/bin/python
#-*- coding: utf-8 -*-

#version 1.5 vom 10.08.2013
#author: Nick Rauter[/B]

[B][COLOR="blue"]import[/B] os

[B][COLOR="red"]#CSV-Datei öffnen[/B]
dateivar = open([B][COLOR="#2e8b57"]"/home/nick/Dokumente/installation.csv"[/B], [B][COLOR="#2e8b57"]"r"[/B])
[B][COLOR="blue"]for[/B] zeile [B][COLOR="blue"]in[/B] dateivar:
     liste = zeile[:-1].split([B][COLOR="#2e8b57"]":"[/B])

[B][COLOR="red"]#home-Verzeichnis anlegen[/B]
verzeichnis = [B][COLOR="#2e8b57"]"/home/"[/B]
pfad = verzeichnis + liste[0]
[B][COLOR="blue"]if not[/B] os.path.exists(pfad):
     os.mkdir(pfad)
[B][COLOR="blue"]print[/B] [B][COLOR="#2e8b57"]"/home success"[/B]

[B][COLOR="red"]#passwd bearbeiten[/B]
passwd = open([B][COLOR="#2e8b57"]"/etc/passwd"[/B], [B][COLOR="#2e8b57"]"a"[/B])
passwd.write(liste[0] + [B][COLOR="#2e8b57"]":"[/B] + liste[1] + [B][COLOR="#2e8b57"]":"[/B] + liste[2] +[B][COLOR="#2e8b57"] ":"[/B] + liste[3] + [B][COLOR="#2e8b57"]":"[/B] + liste[4] + [B][COLOR="#2e8b57"]":"[/B] + liste[5] + [B][COLOR="#2e8b57"]":"[/B] + liste[6])
passwd.close()
[B][COLOR="blue"]print[/B] [B][COLOR="#2e8b57"]"passwd success"[/B]

[B][COLOR="red"]#group bearbeiten[/B]
group = open([B][COLOR="#2e8b57"]"/etc/group"[/B], [B][COLOR="#2e8b57"]"a"[/B])
group.write(liste[0] + [B][COLOR="#2e8b57"]":"[/B] + liste[3] + [B][COLOR="#2e8b57"]":"[/B])
group.close()
[B][COLOR="blue"]print[/B] [B][COLOR="#2e8b57"]"usergroup success"[/B]

dateivar.close()
```




Was das Script halt noch nicht kann, ist prüfen, ob der User und die Nutzergruppe bereits in der /etc/passwd bzw. /etc/group vorhanden sind.

Meine Ideen bisher waren:

Die /etc/passwd zeilenweise einzulesen und jeweils den 1. Wert der Zeile in einen Array schreiben.


Spoiler





```
passwd = open([B][COLOR="#2e8b57"]"/etc/passwd"[/B], [B][COLOR="#2e8b57"]"r"[/B])
zaehler = 0
[B][COLOR="blue"]for[/B] line [B][COLOR="blue"]in[/B] passwd:
     pruefer = line.split([B][COLOR="#2e8b57"]":"[/B])
     array[zaehler] = pruefer[0]
     zaehler += 1
passwd.close()
```




Der Array wird durchgegangen und wenn bis zum Ende kein entsprechender User vorhanden ist, wird einer angelegt:


Spoiler





```
laenge = len(array)
i = 0
[B][COLOR="blue"]while[/B] i <= laenge [B][COLOR="blue"]and[/B] array[i] != liste[0]:
     i += 1
[B][COLOR="blue"]if[/B]  i == laenge:
     passwd.write(liste[0] + [B][COLOR="#2e8b57"]":"[/B] + liste[1] + [B][COLOR="#2e8b57"]":"[/B] + liste[2] +[B][COLOR="#2e8b57"] ":"[/B] + liste[3] + [B][COLOR="#2e8b57"]":"[/B] + liste[4] + [B][COLOR="#2e8b57"]":"[/B] + liste[5] + [B][COLOR="#2e8b57"]":"[/B] + liste[6])
```




Problem dabei ist, dass der Array noch nicht initialisiert ist, weil ich noch nicht herausgefunden habe, wie ich in Python einen leeren Array erzeuge. Die nächstbeste Lösung dafür wäre einen Standartarray mit einer Länge zu erzeugen, die gleich der Zeilenanzahl der /etc/passwd ist.
Das kommt mir aber alles unheimlich umständlich vor und geht sicherlich auch einfacher, kennt sich jemand damit aus?


----------



## Leandros (12. August 2013)

Warum eigentlich so kompliziert? 


```
from subprocess import call
call(["adduser", "foo -g bar")]
```


----------



## Gadget2 (12. August 2013)

Okay, ein bisschen Erklärung dazu wäre nicht schlecht. Habe am WE ja erst mit Python angefangen! 

So wie ich das verstehe ruft "call" ja einfach den Befehl auf, wie als ob ich ihn eingegeben habe. Was macht "foo -g bar"? (Ich hoffe die Dialoge unterdrücken)

Weil es ist sicherlich kein administrativer Vorteil, wenn der Admin dann die ganzen Kommentar-Dialoge durchklicken muss. ^^


----------



## Leandros (12. August 2013)

Das erste Argument ist der Befehl, das zweite Argument die Argumente für den Befehl. 

Ließ dir am besten mal die Hilfe zum adduser Befehl durch. Da kannst du alles was du bisher gecoded hast auch mit erreichen.


----------



## Gadget2 (12. August 2013)

Das habe ich mir nach dem gefundenen Beispiel "call("ls", "-l")" auch schon gedacht, aber leider finde ich auch in der man (unter Debian) kein "-g", ich würde jetzt mal raten und sagen, dass ist die Kurzschreibweise von "--group" ..

..und sind "foo" und "bar" lückenfüller? ^^


----------



## DarkMo (12. August 2013)

foo und bar sind gern genutzte "pseudo" namen oder wie mans nennen mag. wird gern in beispielen benutzt. quasi wie john doe oder max mustermann oder x und y in mathe ^^ zum bsp um zu zeigen, wie man strings verkettet -> $foo = "Hallo"; $bar = "Welt"; echo $foo." ".$bar; (PHP).


----------



## Leandros (12. August 2013)

-g ist eigentlich group und sollte existieren. 

Dachte Foo und Bar währen bekannt.


----------



## Gadget2 (12. August 2013)

-g gibt es nur unter useradd, aber ich denke, ich werde sowieso useradd nehmen, weil ich mir da die Dialoge erspare...


----------



## Leandros (12. August 2013)

Ohh, ich hab immer adduser geschrieben. Meinte useradd


----------

