Scripting Automatisch Benutzer erstellen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Jack7c0
Beiträge: 3
Registriert: 20.11.2009 10:07:28

Scripting Automatisch Benutzer erstellen

Beitrag von Jack7c0 » 20.11.2009 10:28:50

Hi

ich hoffe das einer von euch mir helfen kann, warum mein script nicht läuft.
Was soll es machen:
Es soll aus einer Datei Benutzer erstellen und denn direkt ein Passwort geben.

Die Datei ist so auf gebaut:
Benutzername1
Passwort1
Benutzername2
Passwort2
und so weiter. Wo immer 20 - 30 Namen drin sind.

Mein Script:

Code: Alles auswählen

echo "Automatische Benutzeranlegung"

lfdnr=1
echo " Bitte geben sie die einzulesende Datei an <Pfad/Datei>"
read eingabe
feil=$eingabe

echo "Die Datei wird nun eingelesen"
while read line;
do
row[$lfdnr]=$line
USER=$row[$lfdnr]
echo "lfdnr $line"
let lfdnr=$lfdnr+1
done < $feil

echo " Die Benutzer werden nun angelegt"
for ((i=1; i<$lfdnr; i+2)) do
USER =${row[$i]}
PASS=${row[$i+1]}
expect -c "spawn /user/sbin/adduser --ingroup schueler --home /home/schueler/$USER $USER;
expect -c $PASS;
expect -c $PASS;
expect Name; send \r;
expect Raumnummer; send \r;
expect Telefon; send \r;
expect Telefon; send \r;
expect Sonstiges; send \r;
expect Sind; send j\r;
expect ;"
done

Wenn ich das jetzt ausführe habe ich eine Endlosschleife.

Ich danke euch schonmal für die Antworten

mfg Jack7c0

Benutzeravatar
rolo
Beiträge: 2697
Registriert: 29.08.2002 12:12:25
Lizenz eigener Beiträge: neue BSD Lizenz
Wohnort: hannover

Re: Scripting Automatisch Benutzer erstellen

Beitrag von rolo » 20.11.2009 10:58:15

hi,

ich hab gestern an was ähnlichem gebastelt, allerdings benutzt die lösung eine csv datei zum einlesen der daten. die ist in diesem fall so aufgebaut:

Code: Alles auswählen

name,vorname,gruppe,password
baumann,frank,schueler,telekoma
degowskie,dieter,patient,geheim
das script legt zusätzlich zu deinen anforderungen noch eine gruppe an bzw. fügt den user einer gruppe zu. es setzt den usernamen aus vor und nachnamen zusammen. zusätzlich kann es die user auch wieder entfernen. die passwortübergabe (wie das ganze script) ist sicher nicht optimal (zum passwort: http://debianforum.de/forum/viewtopic.php?f=34&t=115896 ). also ich poste das mal hierein - zum auseinander basteln hab ich gerade keine zeit. vielleicht kannst du etwas damit anfangen. es ist einiger "ballast" enthalten, den du durchaus weglassen kannst.

Code: Alles auswählen

#!/bin/bash
# User erstellen/entfernen mit Hilfe einer CSV-Datei

# parameter überprüfen
if [ $# -lt 2 ]
then
  echo "Benutzung: $0 <csv-datei> <c> (create) <d> (delete)"
  exit 1
fi
echo $2 | grep "^[cd]$"
if [ $? -eq 1 ]
then
  echo "Benutze 'c' fürs anlegen oder 'd' zum löschen von Benutzern"
  exit 1
fi

# variablen anlegen
csvdatei=$1
typeset -i anzahl=`cat $csvdatei | wc -l`
anzahl=$anzahl-1
typeset -i zaehler=0

# user werden eingetragen
if [ $2 = c ]
then
  clear
  echo "Es werden vorraussichtlich $anzahl Benutzer angelegt"
  for line in `cat $csvdatei`
  do
  
    if [ $zaehler -eq 0 ]
    then
      # wir sind in der ersten zeile
      zaehler=1
      continue
    fi
  
    name=`echo $line | cut -d, -f1`
    vorname=`echo $line | cut -d, -f2`
  
    # username aus jeweils ersten 3 buchstaben von vor/nachname
    temp1=`echo $vorname | cut -c 1-3`
    temp2=`echo $name | cut -c 1-3`
    username=$temp1$temp2
  
    gruppe=`echo $line | cut -d, -f3`
    password=`echo $line | cut -d, -f4`

    # gibt es die gruppe bereits?
    grep $gruppe /etc/group >> /dev/null
    if [ $? -eq 1 ] 
    then
      # wenn es die gruppe nicht gibt
      addgroup $gruppe >> create.log 2>&1
    fi

    # user anlegen
    useradd -m $username -g $gruppe --skel /etc/skel >> create.log 2>&1
    if [ $? -eq 0 ]
    then
      # wenn der benutzer fehlerfrei erstellt wurde wird hochgezählt
      zaehler=$zaehler+1
    fi
    
    # passwort erstellen
    echo "$username:$password" | chpasswd >> create.log 2>&1
    # user muss passwort bei erstanmeldung ändern
    passwd -e $username >> create.log 2>&1
    
    # test
    # echo $username

  done
  
  # einmal zurück zählen wegen erster zeile in csv datei
  zaehler=$zaehler-1
  echo "Es wurden $zaehler Benutzer neu eingetragen."

elif [ $2 = d ]
then
  clear
  echo "Es werden vorraussichtlich $anzahl Benutzer entfernt"
  typeset -i zaehler=0
  
  for line in `cat $csvdatei`
  do
    if [ $zaehler -eq 0 ]
    then
      # wir sind in der ersten zeile
      zaehler=1
      continue
    fi

    name=`echo $line | cut -d, -f1`
    vorname=`echo $line | cut -d, -f2`

    # username aus jeweils ersten 3 buchstaben von vor/nachname
    temp1=`echo $vorname | cut -c 1-3`
    temp2=`echo $name | cut -c 1-3`
    username=$temp1$temp2 
    # echo $username
    
    # user inklusive home verzeichnis eliminieren
    deluser $username --remove-home >> del.log 2>&1
    
    if [ $? -eq 0 ]
    then
      # nur wenn fehlerrückage == 0 ist auch ein benutzer entfernt
      zaehler=$zaehler+1
    fi
  done
  
  zaehler=$zaehler-1
  echo "Es wurden $zaehler Benutzer entfernt"

fi 
echo; echo
read -p "Bye!" g
clear

Jack7c0
Beiträge: 3
Registriert: 20.11.2009 10:07:28

Re: Scripting Automatisch Benutzer erstellen

Beitrag von Jack7c0 » 20.11.2009 12:08:10

Danke für die sehr ausführliche Antwort.
Aber was du da geschrieben hast, verstehe ich leider nicht.
Ich bin noch recht neu in diesem Thema deswegen möchte ich gerne das script von mir benutzen und wissen wo der Fehler ist.

uname
Beiträge: 12425
Registriert: 03.06.2008 09:33:02

Re: Scripting Automatisch Benutzer erstellen

Beitrag von uname » 20.11.2009 12:55:59

Ich bin noch recht neu in diesem Thema deswegen möchte ich gerne das script von mir benutzen und wissen wo der Fehler ist.
Den Fehler finde ich so auch nicht. Dein Script ist aber ein wenig ungeeignet, da es mit Hilfe von "expect" interaktive Ein- und Ausgaben simuliert. Das ist für diese Aufgabe nicht notwendig.

Nutze das gepostete Script (habe ich aber auch nicht verifiziert).

Mit

Code: Alles auswählen

man <befehl>
kannst du die Bedeutung von Befehlen herausfinden. Auch kannst du zwischendurch die Werte per

Code: Alles auswählen

echo $variable
ausgeben. Kommentiere die wirklichen Befehle aus oder nutze ein Testsystem. Du kannst in diesem kleinen Beispiel sehr viel über Scriptprogrammierung lernen.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting Automatisch Benutzer erstellen

Beitrag von gms » 20.11.2009 17:21:58

Jack7c0 hat geschrieben: Wenn ich das jetzt ausführe habe ich eine Endlosschleife.
daher werfen wir einen Blick auf dein Schleifenkonstrukt:

Code: Alles auswählen

for ((i=1; i<$lfdnr; i+2)) do
hier wird der Zähler 'i' niemals verändert und die Abfrage 'i<$lfdnr' ist falsch

Code: Alles auswählen

for ((i=1; $i<$lfdnr; i+=2));
hier wir der Zähler bei jedem Schleifendurchlauf um 2 erhöht und der Fehler bei der Schleifenbedingung wurde ausgebessert

Gruß
gms

Jack7c0
Beiträge: 3
Registriert: 20.11.2009 10:07:28

Re: Scripting Automatisch Benutzer erstellen

Beitrag von Jack7c0 » 23.11.2009 13:01:27

hi gms,

danke

es läuft jetzt auch ohne probleme.

und auch dir danke uname

AndreK
Beiträge: 469
Registriert: 17.05.2007 19:20:58

Re: Scripting Automatisch Benutzer erstellen

Beitrag von AndreK » 27.11.2009 18:31:43

Donnerwetter! Welch ein Aufwand. 8O

Danielx: Zitat des Beitrages von atropin entfernt, da es nicht sinnvoll ist, solch einen langen Beitrag komplett zu zitieren.
Zuletzt geändert von Danielx am 28.11.2009 23:49:53, insgesamt 1-mal geändert.
Grund: Zitat entfernt

coresploit
Beiträge: 237
Registriert: 26.04.2009 01:57:27
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nettetal
Kontaktdaten:

Re: Scripting Automatisch Benutzer erstellen

Beitrag von coresploit » 27.11.2009 21:37:51

Zum Thema hoher Aufwand:

Code: Alles auswählen

#!/bin/bash
# Mass user creation/removal script
# File format: user<TAB>group<TAB>password<TAB>first_name<TAB>last_name

case "$1" in
c|create)
	if [ ! -f "$2" ]; then
		echo "Usage: $0 c|create FILE"
		exit 1
	fi
	;;

r|remove)
	if [ ! -f "$2" ]; then
		echo "Usage: $0 r|remove FILE"
		exit 1
	fi
	;;

*)
	echo "Usage: $0 c|r|create|remove FILE"
	exit 1
	;;
esac

case "$1" in
c|create)  echo "Starting creation of users ..." ;;
r|remove)  echo "Starting removal of users ..."  ;;
esac

cat "$2" | while read LINE; do
	# Read columns
	LINE_USER=$(echo $LINE | cut -f1)
	LINE_GROUP=$(echo $LINE | cut -f2)
	LINE_PASS=$(echo $LINE | cut -f3)
	LINE_FNAME=$(echo $LINE | cut -f4)
	LINE_LNAME=$(echo $LINE | cut -f5)

	case "$1" in
	c|create)
		if grep "$LINE_USER" /etc/passwd >/dev/null; then
			echo "User '$LINE_USER' already exists."
		else
			if ! grep "^$LINE_GROUP" /etc/group >/dev/null; then
				if addgroup "$LINE_GROUP" >/dev/null 2>&1 && \
				useradd -g "$LINE_GROUP" -m --skel /etc/skel "$LINE_USER" >/dev/null 2>&1; then
					echo "User '$LINE_USER' created successfully."
				else
					echo "Could not create user '$LINE_USER'."
				fi
			else
				if useradd -g "$LINE_GROUP" -m --skel /etc/skel "$LINE_USER" >/dev/null 2>&1; then
					echo "User '$LINE_USER' created successfully."
				else
					echo "Could not create user '$LINE_USER'."
				fi
			fi
			
		fi
		;;

	r|remove)
		if ! grep "$LINE_USER" /etc/passwd >/dev/null; then
			echo "User '$LINE_USER' does not exist."
		else
			if deluser --remove-home "$LINE_USER" >/dev/null 2>&1; then
				echo "User '$LINE_USER' removed successfully."
			else
				echo "Could not remove user '$LINE_USER'."
			fi
		fi
		;;

	esac
done
echo "Success."
zwar nicht getestet (da in Live-Umgebung), aber sollte klappen. :mrgreen: :mrgreen: :mrgreen:

Antworten