Un script para borrado seguro de copias de respaldo en Bash

EDIT: shred no sirve para sobreescribir en discos sólidos y le quita vida útil.


Se dice que “si tienes que hacerlo tres veces, hazle un script”. Pues bien, en mi caso cada tanto hago respaldos de varias cosas de la PC y el teléfono, pero borrar las copias innecesarias o antiguas se vuelve pesado; son varias y siempre lo hago con borrado seguro, porque #paranóico. Asi que escribí esto:

#!/usr/bin/env bash

# BORRADO SEGURO DE BACKUP

# Pide ruta con autocompletado y asignación a una variable.
read -r -e -p "Ingresa la ruta del fichero que quieres borrar: " ruta_dir

# Normalizar escapes de Readline (\ ) creados por autocompletado.
eval ruta_dir="$ruta_dir" # TRAMPA:  me lo dijo la IA.

# 1ra validación: input no vacío y existe el directorio.
if [ -z "$ruta_dir" ] || [ ! -d "$ruta_dir" ]; then
  echo "La ruta no es válida"
  exit 1
fi

# Muestra todo lo que se sobreescribirá.
printf "\n¡CUIDADO! ESTÁS A PUNTO DE BORRAR PERMANENTEMENTE:\n"
tree "$ruta_dir"
echo ""

# 2da validación: confirmar que se borre todo.
read -r -p "Seguro que quieres borrar todo eso? (s/n): " confirmacion
if [[ "$confirmacion" != [sSyY]* ]]; then
  echo "Operación cancelada."
  exit
fi

#La regex * en "shred -z -u *" se expande en el directorio actual, hay que moverse al deseado.
cd "$ruta_dir" || exit

# Borrado seguro:
# 1. Sobrescribir ficheros.
find "$ruta_dir" -type f -exec shred -z -u {} \; # TRAMPA:  me lo dijo la IA.
# 2. Borrar directorios vacíos (recurisvo).
find "$ruta_dir" -depth -type d -empty -delete # TRAMPA:  me lo dijo la IA.

# Aviso de éxito.
printf "\nFicheros borrados con éxito. Todo listo, mi rey.\n"

Traté de seguir los consejos que me dieron en otro tema como el de la robustez y seguridad, los comentarios breves y procurar que los bloques no contengan iteraciones anidadas.

De todas formas, aunque me sabe mal, debo confesar que la IA me ayudó en algunas cosas. Concretamente, con las flags -r y -e de read (por lo que sea no tengo el manual de ese comando). También con la línea de eval y las dos de find. Ni por asomo sabía de la primera y de las segundas no sabía que se podía hacer eso :sweat_smile: , se suponía que ese comando solo busca ficheros.

En fin, solo quería compartirlo.

1 me gusta
rm -r

Suficente

3 Me gusta

Nah, quise complicarme.

1 me gusta

Estoy muy de acuerdo. Si quiere confirmación puede usar el modo “interactivo”:

rm -i

Combinable, claro está, con el resto de parámetros:

rm -rfi

Veo complicarse de más.

2 Me gusta

Hmmm… a ver, no lo veía inútil o demasiado complicado si se ganaba la seguridad de no poder recuperar info de un lugar en el que no quiero que esté. Iba a defender eso, pero me vengo a enterar de que shred no sobreescribe sobre el mismo espacio en los SSDs:

Writing a block to an SSD does not overwrite the old block. That’s because all recent SSDs use something called “wear leveling”.

To write a block to an SSD, you need to erase it first, and then you can write the new data. But erasing is an operation that can only be executed a limited number of times; each time you do an erase, you “weaken” the hardware, until the block cannot be properly erased anymore.

So instead of erasing and overwriting the same block, wear leveling will make the SSD pick a different, unused block, and will write to this block, leaving the data on the old block in place.

And if the data on the old block is in place, that means it still can be read.

So any of the commands you can use to “overwrite” a file (cp, dd, cat, shred, and many more) have this weakness: It does not actually overwrite the file at all, instead it writes zeroes, random data or whatever to new blocks.

So unlike for HDs, this is not a good way to make sure your data is gone, and cannot be read by someone else.

All of those commands are “bad” for the SSD in the sense that any writes use up the limited number of writes an SSD has, decreasing the lifetime of the SSD. And shred is particularly bad, because it overwrites the file repeatedly. On an HD, this serves a purpose: The read-write-head is never completely centered, so overwriting it multiple time makes sure (or tries to make sure) there’s no residual magnetic data left at the border of the track that could be used by the knowledgeable to reconstruct the data.

Fuente: https://unix.stackexchange.com/questions/593181/is-shred-bad-for-erasing-ssds

Parece que algunas cosas que estuve aprendiendo están algo obsoletas.