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.