অনুসন্ধানকারীর ম্যানুয়াল থেকে:
উদাহরণস্বরূপ এই দুটি কমান্ডের মতো নির্মাণ
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;খুব বিপজ্জনক। এর কারণ হ'ল '{।' ফাইলের আকারে প্রসারিত হয়েছে যার মধ্যে একটি সেমিকোলন বা শেল থেকে আলাদা অন্যান্য অক্ষর থাকতে পারে। উদাহরণস্বরূপ যদি কেউ ফাইল তৈরি করে
/tmp/foo; rm -rf $HOMEতবে উপরের দুটি কমান্ড কারওর হোম ডিরেক্টরি মুছে ফেলতে পারে।সুতরাং এই কারণেই এমন কোনও কমান্ড চালাবেন না যা অবিশ্বস্ত ডেটা (যেমন ফাই লেসের নাম) আদেশগুলিতে দেয় যা আর্গুমেন্টকে আরও ব্যাখ্যা করার জন্য আদেশ হিসাবে ব্যাখ্যা করে (উদাহরণস্বরূপ 'sh')।
শেলটির ক্ষেত্রে, এই সমস্যার জন্য একটি চৌকস কাজ রয়েছে:
# 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যা প্রয়োজনীয় বা নাও হতে পারে) যেখানে একই ধরণের সমস্যা এবং সমাধান প্রয়োগ করা হয়, এবং যা ন্যূনতম উদাহরণ যা আমরা সমস্যার সাথে সমাধান করতে এবং সমাধানের দিকে মনোনিবেশ করতে পারি সামান্য বিভ্রান্তি সম্ভব? দেখুন উপায় কমান্ড `ব্যাশ -c` দ্বারা সঞ্চালিত আর্গুমেন্ট প্রদান
ধন্যবাদ।