В этом коде нет разделения слов (как в функции, которая разделяет переменные при раскрытии без кавычек)$myvar и без кавычек.
Однако существует уязвимость, связанная с внедрением команд, $myvarкоторая расширяется перед передачей вbash . Таким образом, его содержание интерпретируется как код bash!
Пробелы в них приведут к передаче нескольких аргументов cdне из-за разделения слов , а потому, что они будут проанализированы как несколько токенов в синтаксисе оболочки. Со значениемbye;reboot , это перезагрузит! ¹
Здесь вы бы хотели:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
(где вы передаете содержимое в $myvarкачестве первого аргумента этого встроенного скрипта; обратите внимание, как $myvarи$1 были процитированы для их соответствующей оболочки, чтобы предотвратить расщепление IFS-слов (и глобализация)).
Или:
sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'
(где вы передаете содержимое $myvar переменной среды).
Конечно, вы не добьетесь ничего полезного, запустив только cd этот встроенный скрипт (кроме проверки, rootможно ли cdтуда войти). Предположительно, вы хотите, чтобы этот скрипт cdтут же делал что-то еще, например:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Если намерение состояло в том, чтобы использовать , sudoчтобы иметь возможность cdв каталог , который вы в противном случае не имеют доступа к, то , что не может реально работать.
sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"
запустит интерактив bashс текущим каталогом в $myvar. Но эта оболочка будет работать как root.
Вы могли бы сделать:
sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
Чтобы получить непривилегированный интерактив bashс текущим каталогом $myvar, но если у вас не было разрешений cdна этот каталог, вы не сможете ничего сделать в этом каталоге, даже если это ваш текущий рабочий каталог.
$ 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
Исключением может быть, если у вас есть разрешение на поиск для самого каталога, но не для одного из компонентов каталога его пути:
$ 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
¹ Строго говоря, для значений $myvarlike $(seq 10)(в буквальном смысле слова), конечно, произойдет разделение слов при расширении этой подстановки команд bash оболочкой, начинающейся какroot
cdИмеет только эффект внутриbash -cоболочки.