Ich habe eine Textdatei, in der ich alle wichtigen persönlichen Daten speichere, wie die Passwörter aller meiner Konten und die PINs meiner Kreditkarten, falls ich diese vergesse. Natürlich muss diese Datei verschlüsselt werden, also habe ich auf gpg (GNU Privacy Guard) zurückgegriffen.
Das Problem ist, dass ich die Datei hin und wieder erneut öffnen muss, nicht nur zum Lesen, beispielsweise um ein vergessenes Passwort wiederherzustellen, sondern auch zum Schreiben, beispielsweise um das Passwort für ein neues Konto aufzuschreiben, das ich auf einer neuen Site erstellt habe. Dann muss ich das alte Archiv löschen, ein neues Archiv aus der aktualisierten Textdatei erstellen und die Textdatei löschen.
Ich habe ein einfaches Skript geschrieben, um all dies in nur einer Aktion zu erledigen, habe dabei aber heute einen großen Fehler entdeckt: Wenn ich kein neues Passwort eingebe (z. B. wenn ich eine andere Zeichenfolge eingebe und aufgefordert werde, meine Auswahl zu wiederholen), wird das Archiv offensichtlich nicht erstellt, da gpg eine Fehlermeldung ausgibt, das Skript jedoch weitergeht und Ihre neue Textdatei löscht, obwohl es das alte Archiv bereits als erste Aktion gelöscht hat.
Das Skript lautet tatsächlich wie folgt:
rm $1.gpg
gpg -c $1
rm $1
Wie kann ich dies vermeiden, indem ich einen Kontrollzyklus einführe, der die GPG-Fehlermeldung zählt und erkennt, wenn etwas schief gelaufen ist und das neue Archiv nicht erstellt wurde?
Ich weiß, dass ich einfach die erste Zeile löschen kann, möchte aber vermeiden, jedes Mal mit „Ja“ auf die Überschreibungsmeldung zu antworten, da ich weiß, dass das Archiv bereits vorhanden ist. Außerdem möchte ich im Fehlerfall die aktualisierte Textdatei anstelle des alten Archivs behalten, da ich die Datei nicht noch einmal ändern und die Bearbeitung wiederholen möchte (ich könnte sie in der Zwischenzeit sowieso vergessen haben).
Antwort1
Wenn gpg
bei einem Fehler ein Exit-Code ungleich Null zurückgegeben wird, können Sie das überprüfen. Um es zu versuchen, führen Sie den gpg
Befehl aus, erhalten Sie eine Fehlerbedingung und geben Sie dann (vorausgesetzt bash
) ein echo $?
. Wenn die Ausgabe nicht ist 0
, wird Folgendes nur ausgeführt, rm
wenn der vorherige Befehl (in diesem Fall gpg
) erfolgreich war:
if [[ $? -eq 0 ]] ; then
rm "$1"
fi
Alternativ können Sie sicherstellen, dass die .gpg
Datei vorhanden ist, bevor Sie rm
die Textdatei erhalten.
if [[ -f "$1.gpg" ]] ; then
rm "$1"
else
echo "$1.gpg not found, keeping the text file"
fi
Sie können natürlich beide Ansätze kombinieren, um sicherzustellen, dass gpg
sie erfolgreich sindUnddie andere Datei existiert.
Beachten Sie, dass Sie jede Verwendung von Variablen in Anführungszeichen setzen sollten (siehe meinen Code als Beispiel), da sich Ihr Skript sonst bei Dateinamen, die beispielsweise Leerzeichen enthalten, merkwürdig verhält.