उस कोड में कोई शब्द विभाजन नहीं है (जैसा कि उस कोड में वैरिएबल को विभाजित करता है) उस कोड में $myvar
नहीं है जैसा कि अयोग्य नहीं है।
हालांकि एक कमांड इंजेक्शन भेद्यता $myvar
है जिसे पास करने से पहले विस्तारित किया जाता है bash
। तो इसकी सामग्री को बैश कोड के रूप में व्याख्यायित किया जाता है!
वहाँ के रिक्त स्थान शब्द विभाजन केcd
कारण नहीं , बल्कि कई तर्क दिए जाएंगे , क्योंकि उन्हें शेल सिंटैक्स में कई टोकन के रूप में पार्स किया जाएगा। उस मूल्य के साथ , जो रिबूट करेगा! Thatbye;reboot
यहाँ आप चाहते हैं:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
(जहां की सामग्री को पारित $myvar
कि इनलाइन स्क्रिप्ट के पहले तर्क के रूप में; टिप्पणी कैसे दोनों $myvar
और $1
रोकें आईएफएस-शब्द-बंटवारे (और ग्लोबिंग) करने के लिए अपने-अपने खोल के लिए उद्धृत किया गया)।
या:
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
जैसे $(seq 10)
) के मूल्यों के लिए कड़ाई से बोलना, शब्द कमांड प्रतिस्थापन के विस्तार पर निश्चित रूप से शब्द विभाजन होगा जैसे कि bash
शेल द्वाराroot
cd
केवल अंदर प्रभाव पड़ता हैbash -c
खोल।