Anzeige:
Ergebnis 1 bis 3 von 3

Thema: Bash / Skript : Brauche Hilfe um mögliche Fehler-Meldungen abzufragen

  1. #1
    Registrierter Benutzer
    Registriert seit
    Nov 2016
    Beiträge
    81

    Bash / Skript : Brauche Hilfe um mögliche Fehler-Meldungen abzufragen

    Huhu,

    ich scheibe mir grad ein Skript womit ich mir Zertifikate von Providern abspeichern kann.
    Mein Problem ist bei verschachtelten Befehlen, da fehlen mir die Kenntnisse um abzufragen ob der Prozess erfolgreich war.

    Es handelt sich um Zeile 68
    Die 2>&1 sollen in Variablen umgeleitet werden und es soll geprüft werden ob irgend welche Fehler aufgetaucht sind,
    Wenn ja sollen die Fehler aufgelistet werden.

    Hier mal das Skript ...
    Code:
    #!/bin/bash
    # ~/bin/ssl-ca-get
    # Dieses Skript speichert das Zertifikat eines Providers nach ~/.certs
    # und dannach erstellt es die passenden Schlüssel.
    # 2016-12-10 @suleiman
    
    REMHOST=$1
    REMPORT=${2:-993}
    CERTPATH=~/.certs
    CERTFILE="${CERTPATH}/${1}.pem"
    
    ################################
    # Was noch gemacht werden muß...
    # 20 - Abfrage ob $1 eine gültige Adresse ist
    # 37 - select case Anweisung ist übertrieben, ich brauch da was weniger Kompliziertes
    # 40 - GOTO Anweisung einfügen, damit man bei der Abfrage ob man die pem-Datei überschreiben will gleich zur Abfrage des Zertifikats kommt
    # 68 - die 2>&1 sollen in Variablen umgeleitet werden und es soll geprüft werden ob irgend welche Fehler aufgetaucht sind, wenn ja müssen die Fehler aufgelistet werden
    
    # Kontrollieren ob eine Adresse dem Skript übergeben wurde
    if [ -z $REMHOST ]	# Abfragen ob die Variable leer ist
    then			# Ja die Variable ist leer
    	echo "${0}: Es wurde keine Adresse gefunden."
    	echo "${0}: Es muß dem Skript eine Internet Adresse oder IP übergeben werden!"
    	echo "( Optional kann auch eine Portnummer übergeben werden )"
    	echo "Beispiel:"
    	echo "${0} imap.gmx.de 443"
    	echo ""
    	echo "Skript frühzeitig beendet."
    	exit 1
    fi
    
    # Kontrollieren ob das Zertifikat schon vorhanden ist und ob es ersetzt werden soll
    if [ -e $CERTFILE ]	# Checken ob es schon ein passendes Zertifikat gibt
    then			# Es gibt schon eine Datei mit dem gleichen Namen
    	echo "${0}: Es gibt schon eine Datei mit dem gleichen Namen."
    	read -p "${0}: Soll die Datei ${CERTFILE} ersetzt werden (J/n):" YESNO	# Abfragen ob die Datei ersetzt werden soll
    	case "$YESNO" in 							# Die Antwort wir mit mit dieser case Anwendung ausgewertet
    	Yes|yes|Y|y|Ja|ja|J|j)							# Ja die Datei darf überschrieben werden
    		echo "${0}: No Problemo! Datei wird überschieben."
    										# Hier könnt eine GOTO Anweisung eingefügt werden
    	;;
    	*)									# Datei soll NICHT überschrieben werden
    		echo "Skript frühzeitig beendet."
    		exit 0
    	;;
    	esac
    
    
    fi
    
    # Passendes Unterverzsichnis für die Zertifikate gegebenenfalls erstellen
    if [ ! -d $CERTPATH ]	# Abfrage ob ein passendes Unterverzeichnis erstellt wurde
    then 			# Es wurde kein Unterverzeichnis gefunden
    	mkdir $CERTPATH			# Unterverzeichnis erstellen
    	if [ $? -ne 0 ]			# Abfrage ob das Verzeichnis erstellt wurde
    	then				# Verzeichnis konnte nicht erstellt weerden
    		echo "Pfad: ${CERTPATH} konnte nicht erstellt werden."
    		echo "Skript frühzeitig beendet."
    		exit 1			# Skript beenden
    	else				# Verzeichnis wurde erstellt
    		chmod 700 $CERTPATH	# Zugriffsrechte anpassen
    	fi
    fi
    
    # Es wird nun eine ssl-Verbindung aufgebaut und nach dem Zertifikat gefragt.
    # Dann wird die Verbindung wieder beendet und der erhaltene Text wird "sed" übergeben.
    # sed extraiert das Zertifikat und schreibt es in eine Datei.
    echo "cc logout" | openssl s_client -connect ${REMHOST}:${REMPORT} 2>&1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > $CERTFILE
    
    if [ $? -ne 0 ]		# Abfragen ob "sed" korrekt ausgeführt wurde.
    then			# Ein Fehler ist aufgetrehten... Einen Warnschuss ablassen!
    	echo "Fehler ... Error ... MURDER DEATH KILL ... nix Zertifikat, ätsch!"
    	exit 1		# Skript beenden
    fi
    
    # Wenn das Skript bis hier hin kommt ist alles in ordnug soweit und das Zertifikat wurde in eine Datei geparkt.
    echo "${0}: Datei ${CERTFILE} wurde angelegt."
    
    # Jetzt müssen nur noch die Hashkeys gelinkt werden
    echo "${0}: Erstelle nun die hash-keys."
    c_rehash $CERTPATH	# Erstellen der Hashkeys 
    if [ $? -ne 0 ]		# Abfragen ob die Hashkeys korrekt erstellt wurden.
    then			# Ein Fehler ist aufgetrehten... Einen Warnschuss ablassen!
    	echo "${0}: Es konnten keine hash-keys erstellt werden."
    	echo "Skript frühzeitig beendet."
    	exit 1		# Skript beenden
    
    else
    	chmod 600 $CERTFILE	# Zugriffsrechte anpassen
    fi
    
    echo "${0}: Skript wurde erfolgreich ausgeführt. Wünsche einen schönen Tag noch!"
    
    exit 0

  2. #2
    Banned
    Registriert seit
    Feb 2005
    Beiträge
    1.151
    Die bash- interne Variable ist ein Array, das für jedes Command der Pipe den Exitstatus enthält.

    Nachtrag:
    Vielleicht magst du ja den Fehlerkanal ( 2) nicht auf STDOUT (1) legen.
    Da kannst dann die Fehlermeldungen abgreifen.

    Das Array liefert nur Integer.
    Deren befehlsabhängige Bedeutung müsstest du sonst selbst rausfinden und im Script irgendwie mit verwursten.

    Wenn du die Meldungen abgreifen willst, wäre evtl. der Einsatz von tee eine Überlegung wert.
    Geändert von BetterWorld (11.12.16 um 01:25 Uhr)

  3. #3
    Universaldilletant Avatar von fork
    Registriert seit
    Dec 2001
    Ort
    Frankfurt/Main
    Beiträge
    1.175
    Anmerkungen zu diesem Konstrukt

    Code:
    echo "cc logout" | openssl s_client -connect ${REMHOST}:${REMPORT} 2>&1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > $CERTFILE
    
    if [ $? -ne 0 ] ; then
       echo "Fehler aufgetreten"
    fi
    #1 Wenn Du den Exitcode speicherst, dann hast Du die Möglichkeit, den als Information bei der Fehlermeldung mitanzugeben:

    Code:
    befehl1 | befehl2 | befehl3 
    RC=$?
    #2 Der Exitcode einer Pipe ist immer der Exitcode des letzten Befehls der Pipe. Das ist doof, wenn der letzte Befehl korrekt läuft, aber zwischendrin ein Befehl fehlschlägt. Also genau das was bei Deinem Code sehr wahrscheinlich ist. Mit der Option Pipefail bekommst auch einen Fehlercode innerhalb der Pipe. Siehe manpage von bash.

    #3 cat datei.txt | blubkommando | blakommando Das ist eine überflüssige Prozesserzeugung. So würde die eingespart: blubkommando <bla | blakommando. Das hast Du so nicht verwendet. Ist also nur eine Information nebenbei.

    #4 Und jetzt noch etwas für Fortgeschrittene: Du kannst die Fehlerausgabe eines Befehls bzw. einer Pipe auch einfangen:

    Code:
    ERR="$( { befehl_der_fehler_erzeugt >/dev/null; } 2>&1 )"
    Das bedeutet, dass STDOUT deines Befehles nach /dev/null geschrieben wird, also verworfen. Bei Dir oben hast Du STDOUT nicht verworfen, sondern in eine Datei geschrieben(Dein sed-Befehl). Wichtig ist dass STDOUT umgelenkt wird, sonst würden STDOUT und STDERR zusammengefügt. In obigen Beispiel wird STDOUT also verworfen innerhalb des { ... } Blocks. Ausserhalb des Blocks kommt also von STDOUT nichts mehr an. Aber ausserhalb des Blocks ist STDOUT nicht umgelenkt. Deswegen funktioniert das Konstrukt 2>&1 noch wunderbar. Es bedeutet: Schreibe alles von STDERR dorthin wo STDOUT jetzt hinzeigt. D. h. alles was aus dem Block auf STDERR ankommt wird jetzt dorthin umgeleitet, wo STDOUT ausserhalb des Blockes zeigt. Da jetzt also die Daten von STDERR im STDOUT ausgegeben wurden, kann man das ganz bequem in eine Variable einfangen.

    Beides, also Ausgabe von STDOUT und STDERR in separate Variablen abzulegen geht AFAIK nicht.
    Geändert von fork (11.12.16 um 12:27 Uhr)

Ähnliche Themen

  1. Hilfe bei Bash Skript
    Von benny_88 im Forum Linux Allgemein
    Antworten: 9
    Letzter Beitrag: 24.04.09, 13:56
  2. Brauche Hilfe für ein Skript
    Von l1nux4ever im Forum Linux als Server
    Antworten: 4
    Letzter Beitrag: 25.09.08, 12:28
  3. Bash-Skript gibt Fehler aus
    Von Herr Bert im Forum Linux Allgemein
    Antworten: 5
    Letzter Beitrag: 08.03.08, 22:54
  4. Hilfe: Bash-Skript um BESTIMMTE Verzeichnisse zu löschen
    Von Andy09 im Forum Linux Allgemein
    Antworten: 5
    Letzter Beitrag: 23.04.05, 14:56
  5. Brauche Hilfe bei Skript
    Von muxav im Forum Anbindung an die Aussenwelt
    Antworten: 6
    Letzter Beitrag: 08.10.03, 18:23

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •