script-hilfe

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von buli, 16.09.2006.

  1. buli

    buli Debianator

    Dabei seit:
    16.09.2006
    Beiträge:
    789
    Zustimmungen:
    0
    Ort:
    Essen/Ruhrgebiet
    Moin!

    Ich hab mich als völliger Anfänger mal an ein script gewagt.
    Es sollte es vereinfachen, einen Benutzer anzulegen, bzw zu löschen.
    Sieht aus wie folgt:
    Code:
     echo "Benutzerverwaltung"
     echo "Was möchten Sie tun?"
     echo -n "Benuter [a]nlegen? Benutzer [l]öschen?" 
      read user
    
      if [$user="a"]
      then
      echo "Name des Benutzers:"
       read name
      echo "Homeverzeichnis:"
       read home
      echo "Gruppen:"
       read groups
    
      useradd -m -d $home -G $groups $name
        
      echo "Der Benutzer wurde erfolgreich angelegt!"
     
    else
         if [$user="l"]
         then
          echo "Name des Benutzers:"
           read name2
       userdel $name2
          echo "Der Benutzer wurde erfolgreich gelöscht!"
     fi
    Aber ich bekomme immer die Fehlermeldung:
    syntax error: unexpected end of file

    Was ist da schiefgelaufen?
    Die if-Anweisung endet doch mit fi, so wie ich es gelernt habe.

    Danke schonmal für die Antworten!

    P.S.: Ich bin mir sicher, da sind noch mehr syntax-errors ;)
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Ich zähle 2 ifs, aber nur ein fi.

    Gruss, Xanti
     
  4. #3 root1992, 16.09.2006
    root1992

    root1992 von IT-Lehrern besessen

    Dabei seit:
    02.01.2006
    Beiträge:
    1.138
    Zustimmungen:
    0
    Ort:
    Märchenwald
    Ja, if [$user="l"] da hat du das fi vergessen.
    Da ist es ja noch überschaubar, ich habe mal ein Script gehabt, das viele Scripte erstellt, über 1000 Zeilen, und da dann die fis rausfinden
     
  5. #4 Wolfgang, 18.09.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Vermutlich wolltest du statt des zweiten if ein elif verwenden.
    Wenn man mit einem Editor arbeitet welcher Syntaxhighlighting beherrscht (wie vim), dann sollte sowas augenscheinlich werden.

    tm2¢
    Gruß Wolfgang
     
  6. buli

    buli Debianator

    Dabei seit:
    16.09.2006
    Beiträge:
    789
    Zustimmungen:
    0
    Ort:
    Essen/Ruhrgebiet
    Moin!
    script funzt!
    Sieht aus wie folgt:
    Code:
    #!/bin/sh
    #
    # Benutzerverwaltung
    #
     
     echo "Benutzerverwaltung"
     echo "Achtung! Sie müssen als root angemeldet sein!"
     echo "Was möchten Sie tun?"
     echo -n "Benuter [a]nlegen? Benutzer [l]öschen?" 
      read user
    
    
      if [ $user = "a" ]
      then
      echo "Name des Benutzers:"
       read name
      echo "Homeverzeichnis:"
       read home
      echo "Gruppen:"
       read groups
    
      useradd -m -d $home -G $groups $name
      
      echo "Der Benutzer wurde erfolgreich angelegt!"
     
    else
         if [ $user = "l" ]
         then
          echo "Name des Benutzers:"
           read name2
       userdel $name2
        rm -rf /home/$name2
          echo "Der Benutzer wurde erfolgreich gelöscht!"
     fi
     fi
    Der Fehler war
    1.das fehlende fi
    Danke, Xanti

    2. fehlende Abstände zwischen den " [ ] " .

    Linux ist aber sehr case-sensitiv :rolleyes:

    @Wolfgang
    @root1992
    Jo, wenn die scripte länger werden, sollte ich mir das elif angewöhnen :D

    Thx all!
     
  7. #6 Wolfgang, 18.09.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Das hat eigentlich nix mit der Länge des Scriptes zu tun.
    Genau für verschiedene Falluntersuchungen gibt es ja elif.
    Für mehrere Fallunterscheidungen gibt es auch noch case, oder zur eleganteren Auswahl select.
    Die [ ist nur ein Ersatz für test, deshalb muss diese auch deutlich getrennt stehen. (Leerzeichen)

    Das nur mal so als Hinweis.

    Gruß Wolfgang
     
  8. caba

    caba GESPERRT!

    Dabei seit:
    13.08.2002
    Beiträge:
    351
    Zustimmungen:
    0
    Mir ware gerade Langweilig, da dachte ich mir, machst auch mal wieder SH:
    Code:
    #!/bin/sh
    
    UADD="useradd"
    UDEL="userdel"
    RM="/bin/rm"
    
    
    if [ ${UID} != "0" ]; then
    	exit 0;
    fi
    
    echo "Benutzerverwaltung"
    
    function user_add() {
    	echo "Name des Benutzers:"
    	read name
    	echo "Homeverzeichnis:"
    	read home
    	echo "Gruppen:"
    	read groups
    	${UADD} -m -d $home -G $groups $name
    	echo "Der Benutzer wurde erfolgreich angelegt!"
    }
    
    function user_del() {
    	echo "Name des Benutzers:"
    	read name2
    	${UDEL} $name2
       ${RM} -rf /home/$name2
       echo "Der Benutzer wurde erfolgreich gelöscht!"	
    }
    
    function interactive() 
    {
    	echo "Was möchten Sie tun?"
    	echo -n "Benuter [a]nlegen? Benutzer [l]öschen?"
    	read user_cmd
    	
    	if [ ${user_cmd} = "a" ]; then
    		user_add
    	else
    		if [ ${user_cmd} = "l" ]; then
    			user_del
    		fi
    	fi
    }
    
    function info() {
    	echo "Benutzerverwaltung v1"
    }
    
    case ${1} in
    
    "-d"|"--delete")
    	echo "Nothing to do ..."
    ;;
    
    "-a"|"--add")
    	echo "Nothing to do ..."
    ;;
    
    "-i"|"--interactive")
    	interactive	
    ;;
    
    *)
    	info
    ;;
    esac
    

    Eigentlich wollte ich buli nur sagen er kann die Zeile:
    weglassen, lieber eine ${UID} abfrage machen.

    Daraus wurde dann das ^^ :)

    MFG Manuel
     
  9. buli

    buli Debianator

    Dabei seit:
    16.09.2006
    Beiträge:
    789
    Zustimmungen:
    0
    Ort:
    Essen/Ruhrgebiet
    Prima!
    Dein script ist sehr aufschlussreich für mich, was function und case angeht. :)

    Nur leider funzt die root-abfrage bei mir nicht.
    ich kriege auch als root immer ein "permission denied" um die Ohren geknallt.

    Ich habs mal versucht mit
    Code:
    if [ $USER != "root" ]; then
    	exit 0;
    anstatt
    Code:
    if [ ${UID} != "0" ]; then
    	exit 0;
    aber geht auch nicht.

    Was mich auch verwundert ist, dass ich bei Eingabe von "w" in der Konsole weder "root" noch andere Benutzer angezeigt bekomme.
    Ich hab das Gefühl, da stimmt was nicht in der User-verwaltung.:think:
     
  10. #9 Wolfgang, 19.09.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Wenn du die Konsole als user nach einem Login öffnest (also keine Loginshell), gibt dir w den eingeloggten User aus. Selbst wenn du dich mit su zum root gemacht hast, wird dir nicht root angezeigt. Root arbeit dann in der Umgebung des Users!
    Besser ist da entweder whoami oder $UID auszuwerten.

    Code:
    $ [ $UID -eq 0 ] || echo "Du bist nicht root"
    Du bist nicht root
    
    BTW Mit welchem OS arbeitest du hier?

    Gruß Wolfgang
     
  11. buli

    buli Debianator

    Dabei seit:
    16.09.2006
    Beiträge:
    789
    Zustimmungen:
    0
    Ort:
    Essen/Ruhrgebiet
    Ah, so!
    Wieder einen Schritt weiter. :)

    Aber im o.g. script funzt $UID halt nicht.
    In der Konsole wird mir mit whoami root, und mit echo $UID 0 ausgegeben.
    Aber das script will das irgendwie nicht (das von caba)
    SuSE 10.0
    Kernel 2.6.15
    Gnome

    btw: -eq und != kann man doch im selben Kontext verwenden, oder?
    Also, egal ob string, oder Ziffernfolge.
     
  12. #11 Wolfgang, 19.09.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Um kompatibel zu bleiben, sollte man bei numerischen Vergleichen immer -eq -ne -lt -gt usw. verwenden.
    Stringvergleiche können auch in die Hose gehen, wenn die Variable leer ist.
    Ein solcher Test ergibt:
    Warum?
    Ganz simpel, wird der Vergleich [ $VAR = "" ] zu [ ="" ], da VAR ja leer ist.

    Abhilfe schafft hier Quoting, was aber auch nicht immer geht.

    Um ganz sicher zu gehen, verwendet man dort folgendes Konstrukt:

    Das bedeutet, wenn VAR leer ist, ist der Vergleich X = X wahr.

    Unter welchem Benutzer läuft denn nun dein Script wirklich?
    Lass dir doch einfach mal $UID ausgeben.

    Gruß Wolfgang
     
  13. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  14. buli

    buli Debianator

    Dabei seit:
    16.09.2006
    Beiträge:
    789
    Zustimmungen:
    0
    Ort:
    Essen/Ruhrgebiet
    Hi, Wolfgang!
    Deine Erklärung muss ich mir erst mal auf der Zunge zergehen lassen. :D
    Aber zumindest wird man hier als n00b auch ernst genommen, was nicht auf viele Boards zutrifft.
    Dafür erstmal an ein ganz dickes LOB! an alle Mods und Admins!!! :)

    Aber back2topic:

    Naja, unter root halt
    $UID = 0
     
  15. #13 Wolfgang, 19.09.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Abgesehen davon, dass ich deinen Fehler nicht nachvollziehen kann:
    Das o.g. Script hat noch einige Schwachstellen, die besser behoben werden.
    Was, wenn du einen User angibst, der angelegt werden soll und schon existiert?
    Das Gleiche für Löschen umgekehrt?
    Scripte mit Usereingabe sollte man immer kritisch betrachten, und Fehler vorher abfangen.

    Zu Deinem Problem:
    Schreib dein UID Vergleich doch mal in ein Extrascript, was nur UID ausgibt und dann den Vergleich macht.
    Code:
    #!/bin/bash
    echo "Ich bin mit der UID $UID unterwegs"
    if [ "$UID" -eq 0 ]
    then
    echo "Ich bin root mit \$UID $UID"
    else
    echo "Ich bin User mit \$UID $UID" 
    fi
    
    Ausführbar machen und starten.

    Gruß Wolfgang
     
Thema:

script-hilfe

Die Seite wird geladen...

script-hilfe - Ähnliche Themen

  1. Shell Script-Hilfe!

    Shell Script-Hilfe!: Hallo Wolfgang, ich habe flogendes Shell-Script nachgekocht: Beim Original kann ich die Variablen ändern und sie werden dann auch geändert...