W tym kodzie nie ma podziału słów (jak w przypadku funkcji, która dzieli zmienne przy niecytowanych rozszerzeniach), ponieważ $myvarnie jest ona cytowana.
Istnieje jednak usterka $myvarpolegająca na wstrzykiwaniu poleceń, która jest rozszerzana przed przekazaniem do bash. Jego treść jest interpretowana jako kod bashowy!
Spacje w nich spowodują przekazanie kilku argumentów cd, nie z powodu podziału słów , ale dlatego, że zostaną one przeanalizowane jako kilka tokenów w składni powłoki. Z wartością bye;reboot, to uruchomi się ponownie!
Tutaj chciałbyś:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
(gdzie można przekazać zawartość $myvarjako pierwszy argument tego skryptu inline; notatka jak zarówno $myvari $1były notowane odpowiednio dla swoich skorupach, aby zapobiec IFS-word-rozszczepienia (i globbing)).
Lub:
sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'
(gdzie przekazujesz zawartość $myvarzmiennej środowiskowej).
Oczywiście nie osiągniesz niczego użytecznego, uruchamiając tylko cd w tym wbudowanym skrypcie (innym niż sprawdzenie, czy rootmożna cdtam wejść). Prawdopodobnie chcesz, aby ten skrypt cdtam był, a następnie zrób tam coś innego, na przykład:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Jeśli chodziło o to, sudoaby móc przejść cddo katalogu, do którego inaczej nie masz dostępu, to tak naprawdę nie może działać.
sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"
uruchomi interaktywny bashz bieżącym katalogiem w $myvar. Ale ta powłoka będzie działać jako root.
Mógłbyś:
sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
Aby uzyskać nieuprzywilejowaną interaktywność bashz bieżącym katalogiem $myvar, ale jeśli nie masz uprawnień do cdtego katalogu, nie będziesz w stanie nic zrobić w tym katalogu, nawet jeśli jest to twój bieżący katalog roboczy.
$ 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
Wyjątkiem może być posiadanie uprawnień do wyszukiwania do samego katalogu, ale nie do jednego ze składników katalogu jego ścieżki:
$ 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
¹ ściśle mówiąc, w przypadku wartości $myvarpodobnych $(seq 10)(dosłownie), po rozszerzeniu tego podstawiania poleceń przez bash powłokę zacząłoby się dzielenie słówroot
cdMa tylko wpływ wewnątrzbash -cskorupy.