Tidak ada pemisahan kata (seperti pada fitur yang membagi variabel pada ekspansi yang tidak dikutip) dalam kode tersebut karena $myvartidak tidak dikutip.
Namun ada kerentanan injeksi perintah seperti $myvaryang diperluas sebelum diteruskan ke bash. Jadi isinya ditafsirkan sebagai kode bash!
Spasi di sana akan menyebabkan beberapa argumen diteruskan cd, bukan karena pemisahan kata , tetapi karena mereka akan diuraikan sebagai beberapa token dalam sintaks shell. Dengan nilai bye;reboot, itu akan reboot! ¹
Di sini, Anda ingin:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
(di mana Anda melewatkan konten $myvarsebagai argumen pertama dari skrip inline itu; perhatikan bagaimana keduanya $myvardan $1dikutip untuk shell masing-masing untuk mencegah IFS-word-splitting (and globbing)).
Atau:
sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'
(tempat Anda mengirimkan konten $myvardalam variabel lingkungan).
Tentu saja Anda tidak akan mencapai sesuatu yang bermanfaat dengan menjalankan hanya cd dalam skrip inline itu (selain memeriksa apakah rootbisa cdmasuk ke sana). Agaknya, Anda ingin skrip itu cdada di sana dan kemudian melakukan sesuatu yang lain di sana seperti:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Jika maksudnya adalah menggunakan sudountuk dapat cdmasuk ke direktori yang Anda tidak memiliki akses, maka itu tidak bisa benar-benar berfungsi.
sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"
akan memulai interaktif bashdengan direktori saat ini di $myvar. Tapi cangkang itu akan berjalan sebagai root.
Anda bisa melakukannya:
sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
Untuk mendapatkan interaktif bashyang tidak terjangkau dengan direktori saat ini $myvar, tetapi jika Anda tidak memiliki izin untuk cdmasuk ke direktori itu di tempat pertama, Anda tidak akan dapat melakukan apa pun di direktori itu bahkan jika itu adalah direktori kerja Anda saat ini.
$ 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
Pengecualiannya adalah jika Anda memiliki izin pencarian ke direktori itu sendiri tetapi tidak ke salah satu komponen direktori dari jalurnya:
$ 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
¹ secara tegas, untuk nilai-nilai $myvarseperti $(seq 10)(secara harfiah), akan ada pemisahan kata tentu saja pada perluasan penggantian perintah oleh bash shell dimulai sebagairoot
cdsatunya efek di dalambash -cshell.