उस कोड में कोई शब्द विभाजन नहीं है (जैसा कि उस कोड में वैरिएबल को विभाजित करता है) उस कोड में $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खोल।