Esta respuesta supone que $1
está permitido incluir subdirectorios. Si está interesado en el caso más simple donde $1
debería ser un nombre de directorio simple, consulte una de las otras respuestas.
Los comodines no se expanden entre comillas dobles. Como $1
está entre comillas dobles, los comodines no son un problema.
Ambos ../
y los enlaces simbólicos pueden ocultar la ubicación real de un archivo. A continuación se muestran pruebas para determinar si el archivo está realmente, no solo aparentemente, bajo la ruta que queremos.
Sistemas más nuevos: usando realpath
En cuanto a averiguar si el archivo es realmente si el archivo está realmente bajo /home/charlesingalls/
o no, puede usar realpath
:
realpath --relative-base=/home/charlesingalls/ "/home/charlesingalls/$1" | grep -q '^/' && exit 1
Lo anterior se ejecuta exit 1
si el archivo especificado por $1
está en otro lugar que no sea el directorio /home/charlesingalls/
. realpath
canonicaliza todo el camino, eliminando enlaces simbólicos y ../
.
realpath
es parte de GNU coreutils y debería estar disponible en cualquier sistema Linux.
realpath
requiere GNU coreutils 8.15 (enero de 2012) o superior .
Ejemplos
Para demostrar cómo sigue realpath ../
para determinar la ubicación real de un archivo (por ejemplo, -q
se omite la opción de grep para que la salida real de grep sea visible):
$ touch /tmp/test
$ realpath --relative-base=$HOME "$HOME/../../tmp/test" | grep '^/' && echo FAIL
/tmp/test
FAIL
Para demostrar cómo sigue los enlaces simbólicos:
$ ln -s /tmp/test ~/test
$ realpath --relative-base=$HOME "$HOME/test" | grep '^/' && echo FAIL
/tmp/test
FAIL
Sistemas más antiguos: utilizando readlink -e
readlink
también es capaz de cononicalizar una ruta, siguiendo enlaces simbólicos y ../
:
readlink -e "$HOME/test" | grep -q "^$HOME" || exit 1
Usando los mismos archivos de ejemplo:
$ readlink -e "$HOME/../../tmp/test" | grep "$HOME" || echo FAIL
FAIL
$ readlink -e "$HOME/test" | grep "^$HOME" || echo FAIL
FAIL
Además de estar disponibles en sistemas GNU más antiguos, hay versiones de readlink
BSD disponibles.
/
. Los comodines no se interpretan entre comillas.-r
conrm
.rm -r
es para la eliminación recursiva de un directorio y todos los archivos y directorios debajo de él. Solo es útil al eliminar directorios. Más en general, no cultive el cargamento es decir, no solo copie cosas que parecen útiles en su línea de comandos o script sin comprender lo que hacen o cómo funcionan. Los dioses del avión que traen la carga mágica pueden enojarse y eliminar todos sus archivos.