Script de actualización simple de bash gpg

Script de actualización simple de bash gpg

Tengo un archivo de texto en el que guardo todos mis datos personales importantes, como las contraseñas de todas mis cuentas y los PIN de mis tarjetas de crédito, en caso de que los olvide. Obviamente, ese archivo necesita estar cifrado, así que recurrí a gpg (GNU Privacy Guard).

El problema es que de vez en cuando debo volver a abrir el archivo no sólo para leer, como recuperar una contraseña que olvidé, sino también para escribir, como escribir la contraseña de una cuenta nueva que creé en un sitio nuevo. Luego, necesito eliminar el archivo antiguo, crear un nuevo archivo a partir del archivo de texto actualizado y eliminar el archivo de texto.

Hice un script simple para hacer todo esto en solo una acción, pero hoy encontré un error importante: si no ingreso una nueva contraseña (como ingresar una cadena diferente cuando te pide que repita tu elección), el archivo Obviamente no se creará, ya que gpg dará un mensaje de error, pero el script irá más allá, eliminando su nuevo archivo de texto, cuando ya había eliminado el archivo antiguo como primera acción.

De hecho, el guión es el siguiente:

habitación $1.gpg
gpg -c $1
habitación $1

¿Cómo puedo evitar esto, ingresando a un ciclo de control que cuente el mensaje de error gpg, reconociendo cuando algo salió mal y no se creó el nuevo archivo?

Sé que puedo eliminar simplemente la primera línea, pero me gustaría evitar responder "sí" al mensaje de sobrescritura cada vez, ya que sé que el archivo ya existe. Además, me gustaría conservar el archivo de texto actualizado en lugar del archivo antiguo si ocurre algún error, ya que no quiero modificar el archivo otra vez repitiendo la edición (es posible que lo haya olvidado mientras tanto).

Respuesta1

Si gpgdevuelve un código de salida distinto de cero cuando se produce un error, puede comprobarlo. Para intentarlo, ejecute el gpgcomando, obtenga una condición de error y luego (suponiendo bash) ingrese echo $?. Si el resultado no es 0, lo siguiente solo se ejecutará rmsi el comando anterior (en este caso gpg) fue exitoso:

if [[ $? -eq 0 ]] ; then
    rm "$1"
fi

Alternativamente, puede asegurarse de que el .gpgarchivo exista antes que rmel archivo de texto.

if [[ -f "$1.gpg" ]] ; then
    rm "$1"
else
    echo "$1.gpg not found, keeping the text file"
fi

Por supuesto, puedes combinar ambos enfoques, asegurándote de que el gpgresultado sea exitoso.yel otro archivo existe.

Tenga en cuenta que debe citar cualquier uso de las variables (consulte mi código como ejemplo); de lo contrario, su secuencia de comandos se comportará de manera extraña con nombres de archivos que contengan, por ejemplo, espacios.

información relacionada