Shell - Script

Danjel4u

Cadet 1st Year
Registriert
Mai 2007
Beiträge
15
Ich schreibe gerade an ein Script und komm nicht mehr weiter.


add.sh testuser # ist der Befehl im Therminal

add.sh:
Code:
    make=$(grep $1 /etc/test/index.txt | cut -f1,2,4,5,6 | sed 's/R/V/g')
    if [ -f "/etc/test/index.tmp" ]; then
        rm -r /etc/test/index.tmp
    fi
   
    grep -v $1 /etc/test/index.txt > /etc/test/index.tmp
    mv /etc/test/index.tmp /etc/test/index.txt
    sed -i 's#$make#g' /etc/test/index.txt
    exit 0

index.txt
Code:
R    240101201503Z    140103212849Z    04    unknown    /C=DE/ST=Provinz/O=Company/CN=testuser/emailAddress=Mail@MAil

Was soll passieren es soll die Zeile ausgelesen werden wo CN=testuser ins der Zeile ist und geändert werden.
Code:
V    240101201503Z       04    unknown    /C=DE/ST=Provinz/O=Company/CN=testuser/emailAddress=Mail@MAil
Sprich das "R" wird zu "V"
Die Spalte mit "140103212849Z" soll komplett entfernt werden.

Du bekomm ich die Variablen beim grep befehl nicht zum laufen.
 
Das hier wäre meine "quick and diry" Lösung. Dafür sind nicht so viele Tools nötig. Das kann awk mit einem Schlag erledigen =). Ein super (mächtiges Tool um u.a Spalten zu bearbeiten)

#!/bin/bash
$index="/etc/test/index"
awk -v user="$1" -v OFS="\t" '{ if ($6 ~ /user/) print "R", $2, $4, $5, $6; else print $0;}' "${index}.txt" > "${index}.tmp" && mv "${index}.tmp" "${index}.txt"


Die flexibilität lasst sich noch gut ausbauen. Ich hoffe ich habe deine Neugier für awk geweckt ;)
 
Du hast in der zweiten Zeile ein $ zu viel ;)


Ich hab mal sed die Drecksarbeit mit dem Tempfile übernehmen lassen. Ansonsten habe ich auch ne gute Beziehung zu awk^^

Code:
#!/bin/bash

file="test.txt"
awk '/CN='$1'/{print "sed -i \"\" -e \""NR"s/^R/V/\" -e \""NR"s/"$3"....//\" "FILENAME;}' $file | bash

Irgendwie wollte sed weder \t noch \s noch {4} haben, weshalb da vier Punkte im Regex sind. Liegt wahrscheinlich an meiner merkwürdigen OSX Version (oder ich hab um die Zeit das Escapen nicht mehr gebacken bekommen).
Meinungen?

PS: Je mehr ich drüber nachdenke, desto eher würde ich JDs Lösung bevorzugen^^ Jetzt stehts aber einmal da.
 
Freezedevil schrieb:
Du hast in der zweiten Zeile ein $ zu viel ;)


Ich hab mal sed die Drecksarbeit mit dem Tempfile übernehmen lassen. Ansonsten habe ich auch ne gute Beziehung zu awk^^

Code:
#!/bin/bash

file="test.txt"
awk '/CN='$1'/{print "sed -i \"\" -e \""NR"s/^R/V/\" -e \""NR"s/"$3"....//\" "FILENAME;}' $file | bash

Irgendwie wollte sed weder \t noch \s noch {4} haben, weshalb da vier Punkte im Regex sind. Liegt wahrscheinlich an meiner merkwürdigen OSX Version (oder ich hab um die Zeit das Escapen nicht mehr gebacken bekommen).
Meinungen?

PS: Je mehr ich drüber nachdenke, desto eher würde ich JDs Lösung bevorzugen^^ Jetzt stehts aber einmal da.

Ahh, danke für den Hinweiß!
Dein Weg ist ja gewieft :evillol:. Gefällt mir!
Das in-place darf nicht ins Leere greifen und das Escape musste noch Escapet werden und dann klappt ein "\s" wunderbar. bei den vier Punkten würde noch das " 04 " verschluckt werden.
Danach sieht es so aus:
Code:
awk '/CN='$1'/{print "sed -i \""NR"s/^R/V/;"NR"s/"$3"\\s//\" "FILENAME;}' $file | bash

Ehrlich gesagt wäre ich nie darauf gekommen sed über awk zu basteln und dann an eine neue bash zu pipen :> Ich hätte mich mit awk '{system()}' rumgeschlagen.....
 
Danke, an awk habe ich garnicht so gedacht. Muss noch viel lernen. Hoffentlich kommt heute das Buch Shell Programmierung.

So habe das ganze eigbaut. Leider ändert mir der Befehl das ganze Dokument, soll aber nur den Eintrag mit CN=testuser ändern.

Code:
V    240101201503Z    04    unknown    /C=DE/ST=Provinz/O=Company/CN=testuser/emailAddress=Mail@MAil

zwischen "240101201503Z" und "04" muss ein Tab drin sein. Da macht sonst mein weiterer verlauf Probleme.


Edit: Ich merke gerade wie Umfangreich das ganze wird. Ich müsste vorher erst Prüfen ob der Eintrag CN=testuser am Anfang ein V oder R ist. Hab es gerade drüber laufen der schneidet mir dann jedes mal Spalte 3 raus bis nichts mehr da ist.
Wenn die zeile V ist soll nichts geändert werden.


Edit2: Hab es soweit hinbekommen. Fehler war das ich das ganze in eine Funktion gepackt habe. Und $1 nicht mehr vom start befehl genommen worden ist sondern, die von der Funktion. Fehlt nur noch der leer Tab in Spalte 3

Code:
#!/bin/sh
#
# Die addvpnuser erstellt die VPN-Files und den Benutzer Ordner an dem hinterlegten '$DIR' Verzeichnis. Version 2.0
#
#
# Einfach im Terminal "addvpnuser test" eingeben und User Test wird angelegt und VPN-Files erstellt.
# "addvpnuser test leoschen" loescht die VPN-Files, nur VPN-Files! Odener im '$DIR' Verzeichnis wird nach abfrage geloescht!
# "addvpnuser test deaktiv" VPN-Files werden deaktiviert
# "addvpnuser test aktiv" VPN-Files werden wieder aktiviert

# Auslesen der Funktionen / Variablen
. /etc/functions_cron_pack.conf

# Moegliche Parameter

if [ "$1" = '' ]; then
    echo "usage: $0 {username}"
	echo "z.b addvpnuser hansmeier"
    echo "Um User zu loeschen, z.b: $0 hansmeier loeschen"
	echo "Um User nur VPN maeßig zu deaktivieren, z.b: $0 hansmeier deaktiv"
	echo "Um VPN User wieder zu aktivieren, z.b: $0 hansmeier aktiv"	
    exit 0
fi


if [ "$(id -u)" -ne 0 ]; then
       exec sudo $0 $1 $2
       exit 0
fi


loeschen=0
deaktiv=0
aktiv=0
add=0

aktivca() {
	test=$(grep "$1" /etc/openvpn/$VPNdir/index.txt | cut -f1)
	if [ "$test" = R ]; then
		echo "User $1 ist gesperrt, wird jetzt entsperrt"
		awk '/CN='$1'/{print "sed -i \""NR"s/^R/V/;"NR"s/"$3"\\s//\t\" "FILENAME;}' /etc/openvpn/$VPNdir/index.txt | bash
	else
		valid=$(grep $1 /etc/openvpn/$VPNdir/index.txt | cut -f1,2,4,5,6)
		echo "User $1 is nicht gesperrt!"
		echo "$valid"
	fi
	exit 0
}

deaktiv_ca() {
		echo "VPN-User $1 wird deaktiviert" && sleep 10
		cd /etc/openvpn/$VPNdir
	
		openssl ca -revoke /etc/openvpn/$VPNdir/$1.crt
		openssl ca -gencrl -out crl.pem && sleep 2
		echo "VPN-User $1 wurde deaktiviert" && sleep 10
}

make_ca() {
    echo "Script wird zum erstenmal verwendent, erstelle Master und Server Zertifikat!" && sleep 10
    export OPENSSL_CONF=/etc/openvpn/$VPNdir/openssl.cnf
	
    cd /etc/openvpn/$VPNdir
	
    touch serial && echo 01 > serial
	touch index.txt
	
	./CA.pl -newca
	
    echo "erstelle Master Zertifikat" && sleep 10
    openssl req -days 3650 -nodes -new -x509 -keyout ca.key -out ca.crt && sleep 2
	openssl dhparam -out dh2048.pem 2048
	
    echo "erstelle Server Zertifikat" && sleep 10
    openssl req -days 3650 -nodes -new -keyout server.key -out server.csr && sleep 2
	openssl ca -days 3650 -out server.crt -in server.csr && sleep 2
	openssl ca -gencrl -out crl.pem

	echo "Setzte Zertifikate in /etc/openvpn/server.conf" && sleep 10
	sed -i '$a\ca "/etc/openvpn/'"$VPNdir"'/ca.crt"' /etc/openvpn/server.conf
	sed -i '$a\cert "/etc/openvpn/'"$VPNdir"'/server.crt"' /etc/openvpn/server.conf
	sed -i '$a\key "/etc/openvpn/'"$VPNdir"'/server.key"' /etc/openvpn/server.conf
	sed -i '$a\dh "/etc/openvpn/'"$VPNdir"'/dh2048.pem"' /etc/openvpn/server.conf
	sed -i '$a\crl-verify "/etc/openvpn/'"$VPNdir"'/crl.pem"' /etc/openvpn/server.conf
	echo "/etc/openvpn/server.conf wird geoeffnet zum pruefen ob ca.crt; server.crt; server.key; dh2048.pem und crl.pem gesetzt worden sind!"

	echo "Druecken Sie eine beliebige Taste, um fortzufahren!"
	stty raw -echo
	of=/dev/null bs=1 count=1 2> /dev/null}
	stty echo -raw
	nano /etc/openvpn/server.conf
}

del_user() {
	echo -n "Soll VPN Files von $1 geloescht werden [JN]?"
	while ((!gueltig)); do
  		read -sn1 answer1
  		case "$answer1" in
    			[JjYy])    result=1; gueltig=1 ;;
    			[Nn])      result=0; gueltig=1 ;;
   		 	*)         gueltig=0 ;;
 		esac
	done

	echo

	if ((result)); then
		deaktiv_ca
	fi

	echo -n "Soll Benutzer Ordner $DIR/$1 geloescht werden [JN]?"
	while ((!gueltig)); do
  		read -sn1 answer
  		case "$answer" in
    			[JjYy])    result=1; gueltig=1 ;;
    			[Nn])      result=0; gueltig=1 ;;
   		 	*)         gueltig=0 ;;
 		esac
	done

	echo

	if ((result)); then
  		echo "Ordner $DIR/$1 wird geloescht!" && sleep 10
		rm -r $DIR/$1
	fi
	exit 0
}

if [ "$2" = ' ' ]; then
	add=1
fi

case $2 in
		loeschen)
						loeschen=1
						;;
						
		aktiv)
						aktiv=1
						;;
		
		deaktiv)
						deaktiv=1
						;;
esac

if [ "$loeschen" = 1 ]; then
	del_user $1
fi

if [ "$aktiv" = 1 ]; then
	aktivca $1
fi

if [ "$deaktiv" = 1 ]; then
	deaktiv_ca $1
	exit 0
fi

if [ "$add" = 1 ]; then
	if [ `ls /etc/openvpn/$VPNdir | wc -w` -le 1 ]; then
		make_ca
	fi



	if [ ! -d "$DIR/$1" ]; then
		mkdir -p $DIR/$1/{Cc,cronM,VPN}
		mkdir -p $DIR/$1/{OS,Scripte}/files
		chmod -R 755 $DIR/$1
	else
		echo "$DIR/$1 ist schon vorhanden" && sleep 5
	fi

	for datei in `find $VPNdir -name "$1.*" -print 2>/dev/null`
	do
		VPNkey=1
	done


	if [ "$VPNkey" = 1 ]; then
		echo "$1 VPN Files schon angelegt unter /etc/openvpn/$VPNdir"
	else
		cd /etc/openvpn/$VPNdir
	
		export OPENSSL_CONF=/etc/openvpn/$VPNdir/openssl.cnf
	
		echo "Erstelle $1 Zertifikat" && sleep 10
		openssl req -days 3650 -nodes -new -keyout $1.key -out $1.csr && sleep 2
		openssl ca -days 3650 -out $1.crt -in $1.csr
	
		echo "Kopiere VPN-Files nach $DIR/VPN/files" && sleep 10
		cp -R $VPNdir/$1.* $DIR/VPN/files/
		cp -R $VPNdir/ca.crt $DIR/VPN/files/alle/
	fi
fi

if [ "$del" = 1 ]; then
	echo "VPN-Zertifikat von Benutzer $1 wurde gesperrt!"
fi

echo "Fertig! Druecken Sie eine beliebige Taste, um dass Script zu beenden!"
stty raw -echo
dd of=/dev/null bs=1 count=1 2> /dev/null
stty echo -raw

exit 0
 
Zuletzt bearbeitet:
@JD Bei -i steht bei mir merkwürdigerweise folgendes in der manpage
Code:
-i extension
        Edit files in-place, saving backups with the specified extension. 
        If a zero-length extension is given, no backup will be saved.
        It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.

statt normalerweise

-i[SUFFIX], --in-place[=SUFFIX]

	      edit files in place (makes backup if extension supplied)

Da bei mir also zwingen ein Parameter folgen muss hatte ich noch "" dahinter. Die Escape Sequenzen gehen bei mir auch nicht richtig (\\s hatte ich versucht) http://nixtricks.wordpress.com/2012/05/07/sed-replace-a-tab-character-using-sed/
Weil das sed bei mir so vermurkst ist hatte ich mir daher irgendwann mal ssed installiert ist mir jetzt eingefallen. Daran hab ich gestern aber nicht mehr gedacht. Bei mir waren auch eindeutig 4 Leerzeichen zwischen der Zahl und 04 und sind es meiner Meinung nach immernoch^^

Den Weg mir mit awk Kommandos zu basteln und die dann weiter in eine neue Shell zu pipen, gehe ich glaube ich ein bisschen zu oft^^. Das taucht bei mir gefühlt in jedem zweiten Skript auf. Ich glaube häufig gehts auch einfacher. Oben hatte ich dann doch deinen Weg vorgeschlagen, da bei mir für jede Zeile die zu ändern ist ein Prozess gestartet werden muss. Häufig bekommt man davon ja nichts mit, aber unter Umständen merkt man das schon.


@Danjel
Diesen Teil würde ich kürzen, da man die ganzen Abfragen auch direkt in awk erledigen kann.
Code:
        test=$(grep "$1" /etc/openvpn/$VPNdir/index.txt | cut -f1)
	if [ "$test" = R ]; then
		echo "User $1 ist gesperrt, wird jetzt entsperrt"
		awk '/CN='$1'/{print "sed -i \""NR"s/^R/V/;"NR"s/"$3"\\s//\t\" "FILENAME;}' /etc/openvpn/$VPNdir/index.txt | bash
	else
		valid=$(grep $1 /etc/openvpn/$VPNdir/index.txt | cut -f1,2,4,5,6)
		echo "User $1 is nicht gesperrt!"
		echo "$valid"
	fi
	exit 0

(ungetestet)
Code:
awk '/^R.*CN='$1'/ { print "echo \"User '$1' ist gesperrt, wird jetzt entsperrt\";";
                                  print "sed -i \""NR"s/^R/V/;"NR"s/"$3"\\s//\t\" "FILENAME;
                               }
        /^V.*CN='$1'/ { print "echo \"User '$1' ist nicht gesperrt!\";";
                                  print "echo \""$1,$2,$3,$4,$5,$6"\";";
                               } ' | bash

Im Else-Zweig ist ein kleiner Typo. Kannst du mal den Output posten den das Skript erzeugt? Normalerweise ist doch vor und hinter 140103212849Z ein Tab. Daher ist extra einer rausgeschnitten, damit hinterher nicht zwei zwischen "240101201503Z" und "04" sind. Falls das anders gewünscht ist kannst du im Regex einfach das \\s weg lassen (und das von dir eingefügte \t gleich mit, da das nur ein Tab nach dem Kommando einfügt, wenn ich mich grad nicht vergucke).
 
Code:
root@debian /etc/test/ > addvpnuser test aktiv
User test ist gesperrt, wird jetzt entsperrt

Super jetzt passt alles.

Code:
awk '/^R.*CN='$1'/ { print "echo \"User '$1' ist gesperrt, wird jetzt entsperrt\";";
                                  print "sed -i \""NR"s/^R/V/;"NR"s/"$3"//\" "FILENAME;
                               }
        /^V.*CN='$1'/ { print "echo \"User '$1' ist nicht gesperrt!\";";
                                  print "echo \""$1,$2,$3,$4,$5,$6"\";";
                               } ' /etc/openvpn/$VPNdir/index.txt | bash
habe \\s weggelassen.

Im Else-Zweig ist ein kleiner Typo -> Was meinst du damit.
 
Zuletzt bearbeitet:
Freezedevil schrieb:
Bei dir stand
echo "User $1 is nicht gesperrt!"
Da fehlt ein t

du hast doch minuten gewartet bevor du den Text abgeschickt hast, du alter Leet-Speaker :cool_alt:

Schade das sich die sed-versionen zwischen OSx/FreeBSD und ... der restlichen Unix-Welt doch so unterscheiden...

Seid dem ich bei awk wirklich mehr nutze als ein '{print $2}', habe ich einfach ein heiden Spaß daran soviel wie möglich über ein einziges tool zu machen / manipulieren. Sprich nach dem Motto "Tod den Pipes" zu scripten :D sed kann ich leider nicht annähernd so advanced nutzen wie ich mir es wünsche, aber das wird schon (hoffe ich)


@Danjel4u
Code:
case $2 in
loeschen)
loeschen=1
;;
aktiv)
aktiv=1
;;
deaktiv)
deaktiv=1
;;
esac
 
if [ "$loeschen" = 1 ]; then
del_user $1
fi
 
if [ "$aktiv" = 1 ]; then
aktivca $1
fi
 
if [ "$deaktiv" = 1 ]; then
deaktiv_ca $1
exit 0
fi

Ich würde noch das was in " if [ ... ] fi" steht direkt in den jeweiligen case einbauen. So hast du im Moment case praktisch zwei mal gebaut. Zusätzlich würde ich deine Hilfe/Usage-Ausgabe in eine Funktion packen und einen zusätzlichen case für Fehleingaben in $2 bauen.
Code:
[...]
*)
   help_txt() 
;;
esac
 
@ derJD: das mit der Hilfe/Usage-Ausgabe habe ich gemacht.

Code:
helptxt() {
	echo "Um User anzulegen, z.b $0 hansmeier"
	echo "Um User zu loeschen, z.b: $0 hansmeier loeschen"
	echo "Um User nur VPN maeßig zu deaktivieren, z.b: $0 hansmeier deaktiv"
	echo "Um VPN User wieder zu aktivieren, z.b: $0 hansmeier aktiv"
}

mit case - esac habe ich das so weit auch gemacht

Code:
case $2 in
		loeschen)
						deluser $1
						;;
						
		aktiv)
						aktivca $1
						;;
		
		deaktiv)
						deaktivca $1
						exit 0
						;;
esac

wie ich die helptxt in esac bekomm verstehe ich noch nicht ganz.

Zweite Punkt:

Ihr habt mir die awk ... User ist gesperrt..... User ist nicht gesperrt .. abfrage gebaut. Kann man in der awk abfrage die Funktion einbauen, dass wenn User ist nicht gesperrt kommt, dass Script beendet wird?
 
Danjel4u schrieb:
@ derJD: das mit der Hilfe/Usage-Ausgabe habe ich gemacht.

Code:
helptxt() {
	echo "Um User anzulegen, z.b $0 hansmeier"
	echo "Um User zu loeschen, z.b: $0 hansmeier loeschen"
	echo "Um User nur VPN maeßig zu deaktivieren, z.b: $0 hansmeier deaktiv"
	echo "Um VPN User wieder zu aktivieren, z.b: $0 hansmeier aktiv"
}

mit case - esac habe ich das so weit auch gemacht

Code:
case $2 in
		loeschen)
						deluser $1
						;;
						
		aktiv)
						aktivca $1
						;;
		
		deaktiv)
						deaktivca $1
						exit 0
						;;
esac

wie ich die helptxt in esac bekomm verstehe ich noch nicht ganz.

Zweite Punkt:

Ihr habt mir die awk ... User ist gesperrt..... User ist nicht gesperrt .. abfrage gebaut. Kann man in der awk abfrage die Funktion einbauen, dass wenn User ist nicht gesperrt kommt, dass Script beendet wird?


Das würde dann so aussehen:
Code:
case $2 in
		loeschen)
						deluser $1
						;;
						
		aktiv)
						aktivca $1
						;;
		
		deaktiv)
						deaktivca $1
						exit 0
						;;
                *)
                                                help_txt()
                                                exit 0
                                                ;;
esac

Mir fällt auf, dass der Fall $2 = ' ' (also alles innerhalb von if [ $add = 1]...) in den case wandern muss, wenn du den Hilfetext so einbaust. Du musst dann zwar noch ein bisschen umbauen aber dafür hat du den Vorteil, dass du darauf hinweisen kannst das der Wert von $2 Fehlerhaft ist, spich es kann das debuggen und benutzen erleichtern :)

Punkt 2 ist garnicht mal trivial zu lösen =/ Alle exit-codes die du in awk schreiben würdest, werden von der geforkten shell ausgewertet ( | bash) und nicht direkt von deinem Script. Das müsste man teilweise wieder zurückbauen. Was anderes fällt mir leider nicht ein (Irren ist natürlich nicht ausgeschlossen ;))

Code:
if [ $(grep -c "^V.*$1" /etc/openvpn/$VPNdir/index.txt) -gt 0 ]; then
  awk '/^R.*CN='$1'/ { print "echo \"User '$1' ist gesperrt, wird jetzt entsperrt\";"; print "sed -i \""NR"s/^R/V/;"NR"s/"$3"//\" "FILENAME;}' /etc/openvpn/$VPNdir/index.txt | bash
else
  echo "User $1 is nicht gesperrt!"
  grep "^V.*$1" /etc/openvpn/$VPNdir/index.txt
  exit 0
fi
 
ich kapier das nicht so ganz mit dem help_txt()

Code:
case $2 in
		deluser)
						deluser $1
						;;
						
		aktivuser)
						aktivuser $1
						;;
		
		deaktivuser)
						deaktivuser $1
						exit 0
						;;
		adduser)
						adduser $1
						;;
		*)
						help_txt()
						exit 0
						;;
esac

hab jetzt adduser hinzugefügrt. Und das ganze in eine Funktion gepackt

Code:
adduser() {
	if [ `ls /etc/openvpn/$VPNdir | wc -w` -le 1 ]; then
		make_ca
	fi



	if [ ! -d "$DIR/$1" ]; then
		mkdir -p $DIR/$1/{CCcam,cronM,VPN}
		mkdir -p $DIR/$1/{OScam,Scripte}/files
		chmod -R 755 $DIR/$1
	else
		echo "$DIR/$1 ist schon vorhanden" && sleep 5
	fi

	for datei in `find $VPNdir -name "$1.*" -print 2>/dev/null`
	do
		VPNkey=1
	done


	if [ "$VPNkey" = 1 ]; then
		echo "$1 VPN Files schon angelegt unter /etc/openvpn/$VPNdir"
	else
		cd /etc/openvpn/$VPNdir
	
		echo "Erstelle $1 Zertifikat" && sleep 10
		openssl req -days 3650 -nodes -new -keyout $1.key -out $1.csr && sleep 2
		_error $? "Es ist ein Fehler aufgetreten beim erstellen von $1 Zertifikat"
		
		openssl ca -days 3650 -out $1.crt -in $1.csr
		_error $? "Es ist ein Fehler aufgetreten beim erstellen von $1 Zertifikat"
	
		echo "Kopiere VPN-Files nach $DIR/VPN/files" && sleep 10
		cp -R $1.* $DIR/VPN/files/
		_error $? "Es ist ein Fehler aufgetreten beim kopieren von $1 Zertifikate nach $DIR/VPN/files"
		
		cp -R ca.crt $DIR/VPN/files/alle/
		_error $? "Es ist ein Fehler aufgetreten beim kopieren von ca.crt Zertifikate nach $DIR/VPN/alle"
	fi
fi
}
 
Danjel4u schrieb:
ich kapier das nicht so ganz mit dem help_txt()

Code:
case $2 in
		deluser)
						deluser $1
						;;
						
		aktivuser)
						aktivuser $1
						;;
		
		deaktivuser)
						deaktivuser $1
						exit 0
						;;
		adduser)
						adduser $1
						;;
		*)
						help_txt()
						exit 0
						;;
esac

das "*)" sagt einfach: Wenn in $2 etwas anderes drin stehlt als deluser,aktivuser,deaktivuser oder adduser dann wird die Hilfe ausgespuckt. Die Hilfe sollte in eine Funktion, damit du den Hilfe-Text nich 100x in dein Script schreiben musst^^ Inzwischen steht ja in deinem Script: Wenn $1 falsch ist, gebe die hilfe aus und nun steht da auch Wenn $2 falsch ist, gebe die Hilfe aus.
Vielleicht fallen dir später noch mehr Gründe/Situationen ein, in denen du den Hilfe-Text ausgeben willst und da ist doch so eine Funktion die das macht einfach Top :D
 
okay. Dann hab ich es doch richtig kapiert. aber warum setzt du die klammern () hinter help_txt in der case?

hab jetzt einfach help_txt in case geschrieben und so die funktion angelegt.

Code:
help_txt() {
	echo "Um User anzulegen, z.b $0 hansmeier"
	echo "Um User zu loeschen, z.b: $0 hansmeier loeschen"
	echo "Um User nur VPN maeßig zu deaktivieren, z.b: $0 hansmeier deaktiv"
	echo "Um VPN User wieder zu aktivieren, z.b: $0 hansmeier aktiv"
}
 
Auuu, tut mir leid! Einmal falsch geschrieben und den Fehler dann immer weiter copy'n'pasted ... peinlich. Die Klammern haben beim Aufruf nichts zu suchen ^^ sry
 
Danke für eure Hilfe. Hab es soweit fertig gemacht. Funktioniert alles gut.

Ich bastle an mehrern Scripten.

ich mach eine Abfrage von einer Version folgende Ausgabe erhalte ich:
20131207

diesen werten möchte ich mit dem Aktuellen Datum vergleichen. Das mach ich immer mit date +%s (unixtimestamp)
Wie bekomm ich mein Datum aus der Abfrage in Unixtimestamp?


Code:
#!/bin/sh
#
# Die addvpnuser erstellt die VPN-Files und den Benutzer Ordner an dem hinterlegten '$DIR' Verzeichnis. Version 2.0
# Version 2.0
#
# Einfach im Terminal "addvpnuser test" eingeben und User Test wird angelegt und VPN-Files erstellt.
# "addvpnuser test leoschen" loescht die VPN-Files, nur VPN-Files! Odener im '$DIR' Verzeichnis wird nach abfrage geloescht!
# "addvpnuser test deaktiv" VPN-Files werden deaktiviert
# "addvpnuser test aktiv" VPN-Files werden wieder aktiviert

# Auslesen der Funktionen / Variablen
. /etc/functions_cron_pack.conf

if [ "$(id -u)" -ne 0 ]; then
	exec sudo $0 $1 $2
	exit 0 
fi

export OPENSSL_CONF=/etc/openvpn/$VPNdir/openssl.cnf
cd /etc/openvpn/$VPNdir


help_txt() {
	echo "\033[34mUm User anzulegen, z.b $0 hansmeier adduser"	
	echo "Um User zu loeschen, z.b: $0 hansmeier deluser"
	echo "Um User nur VPN maeßig zu deaktivieren, z.b: $0 hansmeier deaktivuser"
	echo "Um VPN User wieder zu aktivieren, z.b: $0 hansmeier aktivuser\033[0m"
}

aktivuser() {
	if [ `ls | wc -w` -le 2 ]; then
		echo "\033[31mServer Zertifikate wurden noch nicht erstellt! Bitte erst 'addvpnuser {username} adduser' eingeben!\033[0m"
		exit
	fi
	
    if [ $(grep -c "^R.*$1" index.txt) -gt 0 ]; then
		awk '/^R.*CN='$1'/ { print "echo \"\033[31mUser '$1' ist gesperrt, wird jetzt entsperrt\033[0m\";"; print "sed -i \""NR"s/^R/V/;"NR"s/"$3"//\" "FILENAME;}' index.txt | bash
		_error $? "Es ist ein Fehler aufgetreten beim aktivieren von VPN User $1" && exit
	else
		echo "\033[31mUser $1 is nicht gesperrt!\033[0m"
		grep "^V.*$1" index.txt
		exit 0
    fi
	
	openssl ca -gencrl -out crl.pem && sleep 2
	_error $? "Es ist ein Fehler aufgetreten beim erstellen von crl.pem" && exit
	
	echo "\033[31m$1 wurde wieder aktiviert!\033[0m"
	exit 0
}

deaktivuser() {
	if [ `ls | wc -w` -le 2 ]; then
		echo "\033[31mServer Zertifikate wurden noch nicht erstellt! Bitte erst 'addvpnuser {username} adduser' eingeben!\033[0m"
		exit
	fi
	if [ $(grep -c "^R.*$1" index.txt) -gt 0 ]; then
		echo "\033[31mVPN-User $1 wurde schon deaktivert!\033[0m" && sleep 10
	else	
		echo "\033[31mVPN-User $1 wird deaktiviert\033[0m" && sleep 10
	fi
	
	openssl ca -revoke $1.crt
	_error $? "Es ist ein Fehler aufgetreten beim Sperren von VPN User $1" && exit
		
	openssl ca -gencrl -out crl.pem && sleep 2
	_error $? "Es ist ein Fehler aufgetreten beim erstellen von crl.pem" && exit
		
	echo "\033[31mVPN-User $1 wurde deaktiviert\033[0m" && sleep 10
}

makeca() {
    echo "\033[31mScript wird zum erstenmal verwendent, erstelle Master und Server Zertifikat!\033[0m" && sleep 10
	
    touch serial && echo 01 > serial
	touch index.txt
	
	echo "\033[31mCA certificate wird gleich erstellt, bitte pass phrase merken. Wird benoetigt um User zu deaktivieren!\033[0m"
	echo "\033[31mDruecken Sie eine beliebige Taste, um fortzufahren!\033[0m"
	stty raw -echo
	of=/dev/null bs=1 count=1 2> /dev/null}
	stty echo -raw

	./CA.pl -newca
	
    echo "\033[31mErstelle Master Zertifikat\033[0m" 
	echo "\033[31mKann eine weile dauern\033[0m" && sleep 10
    openssl req -days 3650 -nodes -new -x509 -keyout ca.key -out ca.crt && sleep 2
	
	if [ "$?" = 1 ]; then
		_error 1 "Es ist ein Fehler aufgetreten beim erstellen vom Master Zertifikat"
		rm -r demoCA serial index.txt *.key *.crt
		exit
	fi 
	
	openssl dhparam -out dh2048.pem 2048
	
	if [ "$?" = 1 ]; then
		_error 1 "Es ist ein Fehler aufgetreten beim erstellen vom Master Zertifikat"
		rm -r demoCA serial index.txt *.key *.crt *.pem
		exit
	fi 

    echo "\033[31mErstelle Server Zertifikat\033[0m" && sleep 10
	echo "\033[31mCommonName muss gleich sein wie username, ganz wichtig!!!\033[0m"
	echo "\033[31mDruecken Sie eine beliebige Taste, um fortzufahren!\033[0m"
	stty raw -echo
	of=/dev/null bs=1 count=1 2> /dev/null}
	stty echo -raw
    openssl req -days 3650 -nodes -new -keyout server.key -out server.csr && sleep 2
	openssl ca -days 3650 -out server.crt -in server.csr
	
	if [ "$?" = 1 ]; then
		_error 1 "Es ist ein Fehler aufgetreten beim erstellen vom Server Zertifikat"
		rm -r demoCA serial index.txt *.key *.crt *.pem *.csr
		exit
	fi 
	
	openssl ca -gencrl -out crl.pem
		if [ "$?" = 1 ]; then
		_error 1 "Es ist ein Fehler aufgetreten beim erstellen von crl.pem"
		exit
	fi 
	
	echo "\033[31mSetzte Zertifikat Angaben in /etc/openvpn/server.conf\033[0m" && sleep 10
	sed -i '$a\ca "/etc/openvpn/'"$VPNdir"'/ca.crt"' /etc/openvpn/server.conf
	sed -i '$a\cert "/etc/openvpn/'"$VPNdir"'/server.crt"' /etc/openvpn/server.conf
	sed -i '$a\key "/etc/openvpn/'"$VPNdir"'/server.key"' /etc/openvpn/server.conf
	sed -i '$a\dh "/etc/openvpn/'"$VPNdir"'/dh2048.pem"' /etc/openvpn/server.conf
	sed -i '$a\crl-verify "/etc/openvpn/'"$VPNdir"'/crl.pem"' /etc/openvpn/server.conf
	
	echo "\033[31m/etc/openvpn/server.conf wird geoeffnet zum pruefen ob ca.crt; server.crt; server.key; dh2048.pem und crl.pem gesetzt worden sind!\033[0m" && sleep 10
	echo "\033[31mDruecken Sie eine beliebige Taste, um fortzufahren!\033[0m"
	stty raw -echo
	of=/dev/null bs=1 count=1 2> /dev/null}
	stty echo -raw
	nano /etc/openvpn/server.conf
}

deluser() {
	if [ `ls | wc -w` -le 2 ]; then
		echo "\033[31mServer Zertifikate wurden noch nicht erstellt! Bitte erst 'addvpnuser {username} adduser' eingeben!\033[0m"
		exit
	fi
	
	echo "\033[31mSoll VPN Files von $1 deaktiviert werden[JN]?\033[0m"
	read deaktiv
	case $deaktiv in
	[YyJj]* ) deaktivuser $1 ;;
	[Nn]* ) echo "\033[31mVPN Files von $1 bleiben aktiv!\033[0m" ;;
	*) echo "\033[31mOrdner von $1 bleibt erhalten!\033[0m" ;;
	esac

	echo "\033[31mSoll Benutzer Ordner $DIR/$1 geloescht werden [JN]?\033[0m"
	read del
	
	if [ -d "$DIR/$1" ]; then
		case $del in
		[YyJj]* ) echo "\033[31mOrdner $DIR/$1 wird geloescht!\033[0m" && rm -r $DIR/$1 ;;
		[Nn]* ) echo "\033[31mOrdner von $1 bleibt erhalten!\033[0m" ;;
		*) echo "\033[31mOrdner von $1 bleibt erhalten!\033[0m" ;;
		esac
	else
		echo "\033[31m$DIR/$1 wurde schon geloescht!\033[0m"
	fi

	exit 0
}

adduser() {
	if [ `ls | wc -w` -le 2 ]; then
		makeca
	fi

	if [ ! -d "$DIR/$1" ]; then
		mkdir -p $DIR/$1/{CC,cronM,VPN}
		mkdir -p $DIR/$1/{OS,Scripte}/files
		chmod -R 755 $DIR/$1
	else
		echo "\033[31m$DIR/$1 ist schon vorhanden\033[0m" && sleep 5
	fi

	for datei in `find -name "$1.*" -print 2>/dev/null`
	do
		VPNkey=1
	done


	if [ "$VPNkey" = 1 ]; then
		echo "\033[31m$1 VPN Files schon angelegt unter /etc/openvpn/$VPNdir\033[0m"
	else
		echo "\033[31mErstelle $1 Zertifikat\033[0m" && sleep 10
		echo "\033[31mCommonName muss gleich sein wie username, ganz wichtig!!!\033[0m"
		echo "\033[31mDruecken Sie eine beliebige Taste, um fortzufahren!\033[0m"
		stty raw -echo
		of=/dev/null bs=1 count=1 2> /dev/null}
		stty echo -raw
		
		openssl req -days 3650 -nodes -new -keyout $1.key -out $1.csr && sleep 2
		openssl ca -days 3650 -out $1.crt -in $1.csr
		
		if [ "$?" = 1 ]; then
			_error 1 "Es ist ein Fehler aufgetreten beim erstellen von $1 Zertifikat"
			rm -r $1.*
			exit
		fi
		
		echo "\033[31mKopiere VPN-Files nach $DIR/VPN/files\033[0m" && sleep 10
		cp -R $1.* $DIR/VPN/files/
		_error $? "Es ist ein Fehler aufgetreten beim kopieren von $1 Zertifikate nach $DIR/VPN/files"
		
		cp -R ca.crt $DIR/VPN/files/alle/
		_error $? "Es ist ein Fehler aufgetreten beim kopieren von ca.crt Zertifikate nach $DIR/VPN/alle"
	fi
}

case $2 in
		deluser)
						deluser $1
						;;
						
		aktivuser)
						aktivuser $1
						;;
		
		deaktivuser)
						deaktivuser $1
						exit 0
						;;
		adduser)
						adduser $1
						;;
		*)
						help_txt
						exit 0
						;;
esac

echo "\033[31mFertig! Druecken Sie eine beliebige Taste, um dass Script zu beenden!\033[0m"
stty raw -echo
dd of=/dev/null bs=1 count=1 2> /dev/null
stty echo -raw

exit 0
 
Zuletzt bearbeitet:
Danjel4u schrieb:
Danke für eure Hilfe. Hab es soweit fertig gemacht. Funktioniert alles gut.

Ich bastle an mehrern Scripten.

ich mach eine Abfrage von einer Version folgende Ausgabe erhalte ich:
20131207

diesen werten möchte ich mit dem Aktuellen Datum vergleichen. Das mach ich immer mit date +%s (unixtimestamp)
Wie bekomm ich mein Datum aus der Abfrage in Unixtimestamp?

Wenn eine 24h tolleranz möglich ist, dann würde ich den umgekherten Weg gehen und das aktuelle Datum in das Schema der Ausgabe bringen:

Code:
date +%Y%m%d

Ansonsten kannst du date, mit der passenden Option, anweisen Strings in ein gewünschtes format umzuwandeln. =)
-d, --date=STRING
display time described by STRING, not 'now'
 
Zurück
Oben