Il n'y a pas de division de mot (comme dans la fonctionnalité qui fractionne les variables lors des extensions non cotées) dans ce code car il $myvarn'est pas non cité.
Il existe cependant une vulnérabilité d'injection de commandes telle qu'elle $myvarest développée avant d'être transmise à bash. Son contenu est donc interprété comme du code bash!
Les espaces qui s'y trouvent entraîneront la transmission de plusieurs arguments cd, non pas à cause du fractionnement de mots , mais parce qu'ils seront analysés comme plusieurs jetons dans la syntaxe du shell. Avec une valeur de bye;reboot, cela redémarrera! ¹
Ici, vous voudriez:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
(où vous passez le contenu de $myvarcomme premier argument de ce script en ligne; notez comment les deux $myvaret $1ont été cités pour leur shell respectif afin d'empêcher le fractionnement de mots IFS (et la globalisation)).
Ou:
sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'
(où vous passez le contenu de $myvardans une variable d'environnement).
Bien sûr, vous n'obtiendrez rien d'utile en exécutant uniquement cd dans ce script en ligne (à part vérifier si vous rootpouvez cdy entrer). Vraisemblablement, vous voulez que ce script soit cdlà et ensuite faire autre chose comme:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Si l'intention était d'utiliser sudopour pouvoir accéder à cdun répertoire auquel vous n'avez pas accès autrement, cela ne peut pas vraiment fonctionner.
sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"
lancera une interaction bashavec son répertoire actuel dans $myvar. Mais ce shell fonctionnera comme root.
Vous pourriez faire:
sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
Pour obtenir une interaction non privilégiée bashavec le répertoire actuel $myvar, mais si vous n'aviez pas les autorisations pour cdy accéder en premier lieu, vous ne pourrez rien faire dans ce répertoire même s'il s'agit de votre répertoire de travail actuel.
$ 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
Une exception serait si vous disposez d'une autorisation de recherche sur le répertoire lui-même mais pas sur l'un des composants de répertoire de son chemin:
$ 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
¹ à proprement parler, pour des valeurs $myvarsimilaires $(seq 10)(littéralement), il y aurait bien sûr un fractionnement des mots lors de l'expansion de cette substitution de commandes par le bash shell commencé commeroot
cdseul a un effet à l'intérieur de labash -ccoque.