В этом коде нет разделения слов (как в функции, которая разделяет переменные при раскрытии без кавычек)$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
¹ Строго говоря, для значений $myvar
like $(seq 10)
(в буквальном смысле слова), конечно, произойдет разделение слов при расширении этой подстановки команд bash
оболочкой, начинающейся какroot
cd
Имеет только эффект внутриbash -c
оболочки.