script-hilfe

buli

buli

Debianator
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 ;)
 
Ich zähle 2 ifs, aber nur ein fi.

Gruss, Xanti
 
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
 
Vermutlich wolltest du statt des zweiten if ein elif verwenden.
if liste
then
befehle
elif liste
then
befehle
else
befehle
fi

Wenn man mit einem Editor arbeitet welcher Syntaxhighlighting beherrscht (wie vim), dann sollte sowas augenscheinlich werden.

tm2¢
Gruß Wolfgang
 
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!
 
Jo, wenn die scripte länger werden, sollte ich mir das elif angewöhnen :D
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
 
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:
echo "Achtung! Sie müssen als root angemeldet sein!"
weglassen, lieber eine ${UID} abfrage machen.

Daraus wurde dann das ^^ :)

MFG Manuel
 
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:
 
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
 
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.
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)
BTW Mit welchem OS arbeitest du hier?
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.
 
btw: -eq und != kann man doch im selben Kontext verwenden, oder?
Also, egal ob string, oder Ziffernfolge.

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:
VAR="";
if [ $VAR = ""]; then echo leer; fi
bash: [: =: unary operator expected
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:

if [ X"$VAR" = "X" ]; then echo leer, fi
leer
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
 
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:

Unter welchem Benutzer läuft denn nun dein Script wirklich?
Naja, unter root halt
Lass dir doch einfach mal $UID ausgeben.
$UID = 0
 
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
 

Ähnliche Themen

NAS-Drive Mount in Bash-Script über crontab

Hilfe für ein shell script

script sshpass

Verschlüsseltes Backup-Script mit rsync

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

Zurück
Oben