In einem Script verkette ich mehrere Befehle, was aber den Nachteil hat, dass sich für die Fehlerbehandlung nur der Exit-Wert des äußeren Befehls auswerten lässt. Hier die Zeile, um die es geht:
sudo -u backup ssh root@${RECHNER} "~/sbin/do_SSHbackup" > $BACKUPDIR/${RECHNER%%.*}/${AKTDATE}.tgz || OK=NOK
Hier wird die Variable OK nur auf NOK gesetzt, wenn z.B. sudo
fehlschlägt oder das Zielverzeichnis nicht existiert. Wirft jedoch das per SSH aufgerufene Script do_SSHbackup einen Fehler, so bekommt die Variable OK nichts davon mit. Auf dem Standardfehlerkanal landet jedoch eine Fehlermeldung.
Wenn ich nun die Ausgabe der Fehlermeldungen in einer Variablen sammeln und diese auswerten könnte, wäre ein Abfangen des Fehlers möglich. Aber wie, ohne dabei den Standardausgabekanal zu beeinflussen? Nach ein wenig Googleei fand ich die Lösung bei stackoverflow.com.
OUTPUT=$( { sudo -u backup ssh root@${RECHNER} "~/sbin/do_SSHbackup" > $BACKUPDIR/${RECHNER%%.*}/${AKTDATE}.tgz; } 2>&1 ) || OK=NOK
Somit bekomme ich alle Fehlermeldungen in die Variable OUTPUT, welche ich im Nachgang auswerten kann:
if [ "$OK" != "OK" -o -n "$OUTPUT" ] ; then echo "$OUTPUT">&2 ... fi