W tym kodzie nie ma podziału słów (jak w przypadku funkcji, która dzieli zmienne przy niecytowanych rozszerzeniach), ponieważ $myvar
nie jest ona cytowana.
Istnieje jednak usterka $myvar
polegają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ść $myvar
jako pierwszy argument tego skryptu inline; notatka jak zarówno $myvar
i $1
był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ść $myvar
zmiennej środowiskowej).
Oczywiście nie osiągniesz niczego użytecznego, uruchamiając tylko cd
w tym wbudowanym skrypcie (innym niż sprawdzenie, czy root
można cd
tam wejść). Prawdopodobnie chcesz, aby ten skrypt cd
tam 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, sudo
aby móc przejść cd
do 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 bash
z 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ść bash
z bieżącym katalogiem $myvar
, ale jeśli nie masz uprawnień do cd
tego 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 $myvar
podobnych $(seq 10)
(dosłownie), po rozszerzeniu tego podstawiania poleceń przez bash
powłokę zacząłoby się dzielenie słówroot
cd
Ma tylko wpływ wewnątrzbash -c
skorupy.