Evitar que un archivo se elimine incluso después de rm -f

Evitar que un archivo se elimine incluso después de rm -f

Normalmente me quedo en StackOverflow, pero creo que en este tema ustedes son mucho más expertos aquí.

Así que el ejercicio de hoy es raro, tengo que escribir un script.shy en él hacer todo lo posible para evitar test.txtque lo eliminen, pero el problema es que la última líneatieneser

rm -f test.txt

Realmente no sé mucho sobre Shell (normalmente hago c/objective-c), así que cogí un libro, no lo he terminado pero todavía no tengo idea de cómo hacerlo.

Pensé en los permisos, pero el script recibirá todos los permisos cuando se pruebe, por lo que no es una opción... (No sé si importa, pero el script se ejecutará en OS X).

Respuesta1

En Linux, puede usar el indicador inmutable chattrpara lograr solo lectura en un nivel de sistema de archivos (aunque requiere los permisos adecuados). No uso OS X y no sé si tiene algo similar, pero puedes lograr "después de ejecutar el script, test.txttodavía existe" usando:

#!/bin/sh
mv test.txt test.bak
trap "mv test.bak test.txt" EXIT

rm -f test.txt

Este script cambia el nombre test.txty test.baklo renombra nuevamente cuando el script sale (después de rm -f test.txt). Esto no es realmente de solo lectura, pero a menos que utilice kill -KILLsu secuencia de comandos, al menos debería conservar sus datos.

Idea alternativa, si insistes en tener esa línea, ¿por qué no salir antes?

#!/bin/sh
# do your thing
exit
# my boss insisted to have the 'rm' line below.

rm -f test.txt

Alternativa que se convierte rmen una función que no hace nada:

#!/bin/sh
# do your thing
rm() {
    # this function does absolutely nothing
    : # ... but it has to contain something
}

rm -f test.txt

Similar al método de función anterior, pero usando el aliascomando obsoleto para crear un alias rmal trueintegrado que no hace nada (pero devuelve un código de salida verdadero):

#!/bin/sh
# do your thing
alias rm=true

rm -f test.txt

Alternativa que elimina rmdel entorno (asumiendo que no hay rmincorporado):

#!/bin/sh
# do your thing
PATH= # now all programs are gone, mwuahaha

# gives error: bash: rm: No such file or directory
rm -f test.txt

Otro que cambia $PATHusando un rmprograma stub (usando /tmpcomo ruta de búsqueda):

#!/bin/sh
# do your thing
>/tmp/rm # create an empty "rm" file
chmod +x /tmp/rm
PATH=/tmp

rm -f test.txt

Para obtener más información sobre las funciones integradas, ejecute help <built-in>para obtener más detalles. Por ejemplo:

true: true
    Return a successful result.

    Exit Status:
    Always succeeds.

Para otros comandos, use man rmo busque en la página del manual, man bash.

Respuesta2

Eliminar un archivo requiere permiso de escritura en el directorio que lo contiene.

$ chmod -w .
$ rm -f test.txt
rm: cannot remove `test.txt': Permission denied

Probablemente deberías hacer esto en un directorio temporal creado para este propósito; no desea eliminar el permiso de escritura en su directorio personal, por ejemplo, aunque es bastante fácil de recuperar conchmod +w .

información relacionada