Não há divisão de palavras (como no recurso que divide variáveis em expansões não citadas) nesse código, pois $myvar
não é entre aspas.
Existe, no entanto, uma vulnerabilidade de injeção de comando, que $myvar
é expandida antes de ser passada para bash
. Portanto, seu conteúdo é interpretado como código bash!
Os espaços lá farão com que vários argumentos sejam transmitidos cd
, não por causa da divisão de palavras , mas porque eles serão analisados como vários tokens na sintaxe do shell. Com um valor de bye;reboot
, isso será reiniciado! ¹
Aqui, você deseja:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
(onde você passa o conteúdo $myvar
como o primeiro argumento desse script embutido; observe como $myvar
e $1
foram citados para o respectivo shell para impedir a divisão de palavras IFS (e globbing)).
Ou:
sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'
(onde você passa o conteúdo $myvar
em uma variável de ambiente).
Obviamente, você não conseguirá nada útil executando apenas cd
esse script embutido (além de verificar se root
pode cd
entrar nele). Presumivelmente, você deseja que esse script chegue cd
lá e faça outra coisa como:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Se a intenção era usar sudo
para poder cd
entrar em um diretório ao qual você não tem acesso, isso não pode realmente funcionar.
sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"
iniciará um interativo bash
com seu diretório atual em $myvar
. Mas esse shell estará rodando como root
.
Você poderia fazer:
sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
Para obter uma interatividade sem privilégios bash
com o diretório atual $myvar
, mas se você não tiver as permissões para cd
entrar nesse diretório em primeiro lugar, não poderá fazer nada nesse diretório, mesmo que seja seu diretório de trabalho atual.
$ 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
Uma exceção seria se você tiver permissão de pesquisa para o próprio diretório, mas não para um dos componentes do diretório de seu caminho:
$ 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
¹ estritamente falando, para valores $myvar
iguais $(seq 10)
(literalmente), haveria divisão de palavras, é claro, após a expansão dessa substituição de comando pelo bash
shell, iniciada comoroot
cd
único tem efeito dentro dobash -c
shell.