Hiçbir var sözcüklere ayırma o kodda olduğu gibi (tırnaksız açılımları üzerine böler değişkenler bu özelliği gibi) $myvar
tırnak içine edilmez.
Bununla birlikte $myvar
, geçirilmeden önce genişletilen bir komut enjeksiyon güvenlik açığı bulunmaktadır bash
. Yani içeriği bash kodu olarak yorumlanıyor!
Buradaki boşluklar cd
, kelime bölme nedeniyle değil , kabuk sözdiziminde birkaç jeton olarak ayrıştırılacağı için birkaç argümanın iletilmesine neden olur . Değeri ile bye;reboot
bu yeniden başlatılacak!
Burada şunu istersiniz:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
( $myvar
bu satır içi komut dosyasının içeriğini ilk argüman olarak geçtiğinizde, IFS kelimesinin bölünmesini (ve globbing'i) önlemek için her ikisinin $myvar
ve $1
kendi kabukları için nasıl alıntılandığını not edin ).
Veya:
sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'
(içeriğini $myvar
bir ortam değişkeninde ilettiğiniz yer).
Tabii ki, sadece cd
bu satır içi komut dosyasında ( oraya girip giremeyeceğini kontrol etmek dışında) faydalı bir şey elde root
edemezsiniz cd
. Muhtemelen, o betiğin cd
oraya gitmesini ve ardından başka bir şey yapmasını istersiniz:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Niyeti kullanmak olsaydı sudo
edebilmek için cd
aksi sonra, o olamaz gerçekten işi için erişimi olmayan bir dizine.
sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"
bash
geçerli dizini ile bir etkileşimli başlatır $myvar
. Ama bu kabuk şöyle çalışacak root
.
Şunları yapabilirsiniz:
sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash
Geçerli dizinin ayrıcalıklı bir etkileşimli olmasını sağlamak için $myvar
, ancak cd
ilk etapta o dizine girme izniniz yoksa, geçerli dizininiz olsa bile bu dizinde hiçbir şey yapamazsınız.
$ 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
Bir istisna , dizinin kendisine arama izniniz varsa , ancak yolunun dizin bileşenlerinden birine sahip değilseniz:
$ 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
Speaking açık konuşmak gerekirse, $myvar
benzer değerler için $(seq 10)
(kelimenin tam anlamıyla), bu komut ikamesinin bash
kabuk tarafından genişletilmesi üzerine elbette kelime bölünmesi olacaktır.root
cd
İçinde yalnızca bir etkiye sahipbash -c
kabuk.