मैनुअलटल के मैनुअल से:
उदाहरण के लिए इन दो कमांड जैसे निर्माण करता है
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;
बहुत खतरनाक हैं। इसका कारण यह है कि '{}' का विस्तार एक फ़ाइल नाम के साथ किया जा सकता है, जिसमें शेल के लिए एक अर्धविराम या अन्य वर्ण हो सकते हैं। उदाहरण के लिए अगर कोई फ़ाइल बनाता है
/tmp/foo; rm -rf $HOME
तो ऊपर दिए गए दो कमांड किसी के होम डायरेक्टरी को डिलीट कर सकते हैं।तो इस कारण से कोई भी कमांड नहीं चलाएंगे जो कि अविश्वासित डेटा (जैसे कि फाई लेस के नाम) को कमांड देगा, जो तर्कों को कमांड के रूप में आगे व्याख्या की जाएगी (उदाहरण के लिए 'श')।
शेल के मामले में, इस समस्या के लिए एक चतुर समाधान है:
# safer find -exec sh -c 'something "$@"' sh {} \; find -execdir sh -c 'something "$@"' sh {} \;
यह दृष्टिकोण हर समस्या से बचने की गारंटी नहीं है, लेकिन यह शेल कमांड के पाठ में हमलावर की पसंद के डेटा को प्रतिस्थापित करने की तुलना में अधिक सुरक्षित है।
- क्या इस समस्या का कारण यह है
find -exec sh -c "something {}" \;
कि प्रतिस्थापन के लिए{}
अयोग्य है और इसलिए इसे एक स्ट्रिंग के रूप में नहीं माना जाता है? समाधान में
find -exec sh -c 'something "$@"' sh {} \;
,पहले
{}
बदल दिया गया है, लेकिन जब{}
से अयोग्य है,"$@"
तो मूल कमांड के समान समस्या नहीं है ? उदाहरण के लिए,"$@"
विस्तार करने के लिए किया जाएगा"/tmp/foo;"
,"rm"
,"-rf"
, और"$HOME"
?क्यों
{}
नहीं बच गया या उद्धृत किया गया?
- क्या आप अन्य उदाहरण दे सकते हैं (
sh -c
यदि इसके साथ या इसके बिना, यदि लागू हो; इसके साथ याfind
जिसके बिना आवश्यक नहीं हो सकता है) जहां एक ही तरह की समस्या और समाधान लागू होते हैं, और जो न्यूनतम उदाहरण हैं ताकि हम समस्या और समाधान पर ध्यान केंद्रित कर सकें संभव के रूप में थोड़ा ध्यान भंग? `Bash -c` द्वारा निष्पादित कमांड के लिए तर्क प्रदान करने के तरीके देखें
धन्यवाद।