No hay división de palabras (como en la función que divide las variables en expansiones sin comillas) en ese código, ya $myvar
que no está sin comillas.
Sin embargo, existe una vulnerabilidad de inyección de comandos que $myvar
se expande antes de pasar a bash
. ¡Entonces su contenido se interpreta como código bash!
Los espacios allí causarán que se pasen varios argumentos cd
, no debido a la división de palabras , sino porque se analizarán como varios tokens en la sintaxis del shell. ¡Con un valor de bye;reboot
, eso se reiniciará! ¹
Aquí te gustaría:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
(donde pasa el contenido de $myvar
como el primer argumento de esa secuencia de comandos en línea; tenga en cuenta cómo ambos $myvar
y $1
fueron citados por su respectivo shell para evitar la división de palabras IFS (y globbing)).
O:
sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'
(donde pasa el contenido de $myvar
en una variable de entorno).
Por supuesto, no logrará nada útil ejecutando solo cd
en ese script en línea (aparte de verificar si root
puede hacerlo cd
allí). Presumiblemente, desea que ese script esté cd
allí y luego haga algo más como:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Si la intención era usar sudo
para poder cd
ingresar a un directorio al que de otra manera no tendría acceso, entonces eso realmente no puede funcionar.
sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"
iniciará un interactivo bash
con su directorio actual en $myvar
. Pero ese shell se ejecutará como root
.
Podrías hacerlo:
sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
Para obtener una interacción no privilegiada bash
con el directorio actual $myvar
, pero si no tenía los permisos para cd
ingresar a ese directorio en primer lugar, no podrá hacer nada en ese directorio, incluso si es su directorio de trabajo actual.
$ myvar=/var/spool/cron/crontabs
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ ls
ls: cannot open directory '.': Permission denied
Una excepción sería si tiene permiso de búsqueda para el directorio en sí pero no para uno de los componentes del directorio de su ruta:
$ myvar=1/2
$ mkdir -p "$myvar"
$ chmod 0 1
$ cd 1/2
cd: permission denied: 1/2
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ pwd
/home/stephane/1/2
bash-4.4$ mkdir 3
bash-4.4$ ls
3
bash-4.4$ cd "$PWD"
bash: cd: /home/stephane/1/2: Permission denied
¹ estrictamente hablando, para valores de $myvar
like $(seq 10)
(literalmente), habría división de palabras, por supuesto, al expandir la sustitución de ese comando por el bash
shell iniciado comoroot
cd
único tiene efecto dentro delbash -c
caparazón.