আমি কীভাবে শেল স্ক্রিপ্টগুলি থেকে নিরাপদে টেম্প ফাইলগুলি তৈরি এবং অ্যাক্সেস করতে পারি?


14

আমি পড়েছি যে কোনও স্থিত নাম ফাইলে আউটপুট পুনঃনির্দেশ /tmpকরা একটি সুরক্ষা ঝুঁকি হতে পারে, কারণ যদি কোনও আক্রমণকারী (বা ত্রুটিযুক্ত) লক্ষ্য করে যে /tmp/tmpfileformyscript.tmpআমি যখন আমার স্ক্রিপ্টটি চালাচ্ছি তখন একটি ফাইল তৈরি হয়েছিল (এমনকি যদি সে আমার কাছে অ্যাক্সেস না পড়ে তবেও) স্ক্রিপ্ট), তিনি উদাহরণস্বরূপ একটি সিমিলিংক তৈরি করতে পারেন ln -s ~wildcard/.bashrc /tmp/tmpfileformyscript.tmpযা .bashrcআমার স্ক্রিপ্টটি চালানোর সময় আমার ফাইলটি নষ্ট করে দেবে ।

সুতরাং পরিবর্তে আমি যেমন কিছু ব্যবহার করতে পারেন filename="tmpfile.tmp.$RANDOM" ; echo outputtext > "$filename"

যাইহোক, আমি কখনও কখনও ক্যাশে যাওয়ার জন্য একটি টিএমপি ফাইলটি ব্যবহার করতে চাই, "tmpfile.tmp। *" এর সাথে যে কোনও কিছুর সাথে মেলে কিনা /tmpতা জানতে চাই এবং একটি নতুন ফাইল তৈরির পরিবর্তে ফাইলটি ব্যবহার করুন। দুর্ভাগ্যক্রমে testএবং সমতুল্য [ -f filename ]যতদূর আমি বলতে পারি ফাইল গ্লোব্বিং সমর্থন করে না।

সুতরাং আমার প্রশ্ন দ্বিগুণ:

  1. আমি কীভাবে নিরাপদে একটি মোচড় তৈরি করতে পারি? কি "predictablename.$RANDOM"একটি গ্রহণযোগ্য অনুশীলন বা একটি ভালো (আরো নিরাপদ, সহজ) উপায় নেই?
  2. আমি কীভাবে সহজেই ফাইলটি অ্যাক্সেস করতে পারি এবং / বা পরে পরীক্ষা করে এর অস্তিত্ব প্রতিষ্ঠা করতে পারি predictablename?

উত্তর:


13

mktempঅপ্রত্যাশিত নাম সহ অস্থায়ী ফাইল তৈরি করতে ইউটিলিটিটি ব্যবহার করুন । এটি পসিক্স দ্বারা প্রমিত নয়, তবে এটি * বিএসডি পাশাপাশি লিনাক্সে উপলব্ধ।

> /tmp/predictable.$RANDOMএটি একটি ভাল পছন্দ নয় কারণ এটি বেশিরভাগই অনুমানযোগ্য ¹, যা আপনার স্ক্রিপ্টটিকে এমন আক্রমণে প্রর্দশিত করে যেখানে আক্রমণকারী আপনার লিখিত অ্যাক্সেসের কোনও ফাইলকে ওভাররাইট করতে বা অস্থায়ী ফাইলটিতে অ্যাক্সেস দেওয়ার ক্ষেত্রে আপনার স্ক্রিপ্টটিকে চালিত করতে পারে। এটি একটি নিরাপত্তাহীন অস্থায়ী ফাইল দুর্বলতা। mktempএই দুর্বলতা নেই কারণ ফাইলটি নিরাপদে তৈরি করে (এটি কোনও বিদ্যমান ফাইলকে ওভাররাইট করতে পারে না, এমনকি প্রতীকী লিঙ্কগুলি জড়িত থাকলেও) এবং পরিষেবা অস্বীকার এড়ানোর জন্য যথেষ্ট অপ্রত্যাশিত নাম ব্যবহার করে।

যদি একটি অস্থায়ী ফাইল তৈরি করা হয় এবং এর সাথে কাজ করা যথেষ্ট ভাল না হয় তবে একটি অস্থায়ী ডিরেক্টরি তৈরি করুন mktemp -dএবং সেখানে কাজ করুন।

mktemp$TMPDIRভেরিয়েবলটি সেট করা আছে /tmpকিনা তা ব্যবহারে যত্ন নেওয়া হয় , যদি এটি সেট না করা হয় তবে পিছনে পড়ে যান ।

আরও বেশি সংখ্যক বিতরণগুলি TMPDIRএকটি ব্যক্তিগত ডিরেক্টরি হিসাবে সেট আপ হয়, যেমন আপনার ইউআইডি /run/1234/tmpকোথায় 1234। এটি ব্যবহারকারীদের মধ্যে অস্থায়ী ফাইলগুলি ভাগ করতে না পারার কারণে অস্থায়ী ফাইলের দুর্বলতার ঝুঁকি দূর করে (যা মাঝে মাঝে দরকারী, তবে খুব বেশি সময় নয়; /tmpএখনও পাওয়া যায়, ঠিক নয় TMPDIR)।

আপনার যদি পুনরুত্পাদনযোগ্য ফাইলের নামের প্রয়োজন হয় তবে ব্যবহারকারীর হোম ডিরেক্টরিতে একটি সুস্পষ্ট সংজ্ঞাযুক্ত নাম (কোনও এলোমেলো উপাদান নয়) দিয়ে একটি ফাইল তৈরি করুন। আধুনিক কনভেনশন হ'ল এক্সডিজি ব্যবহারকারী ডিরেক্টরি স্পেসিফিকেশন । যদি ডেটা ক্ষতি না ঘটিয়ে ফাইলটি সরিয়ে ফেলা যায় XDG_CACHE_HOME, ডিফল্ট হয়ে পরিবেশ পরিবর্তনশীলটি ব্যবহার করুন ~/.cache। আপনার অ্যাপ্লিকেশনটির নাম অনুসারে আপনার সম্ভবত একটি সাব-ডিরেক্টরি তৈরি করা উচিত এবং সেখানে কাজ করা উচিত।

CACHE_DIR="${XDG_CACHE_HOME:-"$HOME/.cache"}"/Wildcard-scripts
[ -d "$CACHE_DIR" ] || mkdir -p -- "$CACHE_DIR"
CACHE_FILE="$CACHE_DIR/tmpfileformyscript"

Only কেবল $RANDOM32767 সম্ভাব্য মান নেয় না , তবে অনেকগুলি মানও চেষ্টা না করে ভবিষ্যদ্বাণী করা সহজ। বাশের এলোমেলো নম্বর জেনারেটর হ'ল একটি এলসিজি যা পিআইডি এবং প্রথম ব্যবহারের সময় দ্বারা বীজযুক্ত হয়। Zsh's হ'ল প্ল্যাটফর্মটির randসূচনা সময়ের সময় অনুসারে এটিএম Ksh's হল প্ল্যাটফর্মটির randপিআইডি প্রণীত । ম্যাক্স হ'ল একটি এলসিজি যা আরও জটিল, তবে এখনও সুরক্ষার মানের বীজ নয়। এগুলির সকলেরই সাফল্যের মোটামুটি বড় সম্ভাবনা নিয়ে অন্য একটি প্রক্রিয়া দ্বারা অনুমান করা যায়।


আসলে আপনার আলোচনা $TMPDIRএবং ~/.cacheআমার প্রয়োজনটি হ'ল। আরও কিছু চিন্তা করার পরে আমি বুঝতে পারলাম যে আমি এটি চেয়েছিলাম তার একমাত্র কারণ /tmpছিল পার্টিশন — সুতরাং ক্যাশে /homeপার্টিশনটি পূরণ করতে পারেনি । তবে এই ব্যবহারের ক্ষেত্রে এটি সত্যিই সম্পূর্ণ অ-ইস্যু, সুতরাং ~/.cacheআমার প্রয়োজনের একটি উপ-ডিরেক্টরিটি আমার প্রয়োজনগুলি পুরোপুরি ফিট করে এবং সুরক্ষা সমস্যাটি এড়িয়ে যায়।
ওয়াইল্ডকার্ড

mktempউইন্ডোজ এআইএক্স বা গিট শেল উপলভ্য নয়। দেখে মনে file.$RANDOM$RANDOMহচ্ছে বহনযোগ্য সমাধান। $RANDOM$RANDOMবাশ এলোমেলো ফলাফলগুলি স্বতন্ত্র এবং দুর্বল নয় বলে ধরে নিয়ে এই স্থানটি 2 ^ 32 এ স্থান বৃদ্ধি করা উচিত।

@jww বাশের এলোমেলো ফলাফল দুর্বল: এটি একটি এলসিজি, যা অনেকগুলি অ্যাপ্লিকেশনের জন্য অপ্রত্যাশিততার প্রয়োজন হয় না হিসাবে যথেষ্ট ভাল হওয়ার পরে এটি প্রায় অনুমানযোগ্য।
গিলস 'অশুভ হওয়া বন্ধ করুন'

9

mktemp এই জন্য ডিজাইন করা হয়েছিল। ম্যান পৃষ্ঠা থেকে:

TMPFILE=`mktemp /tmp/example.XXXXXXXXXX` || exit 1
echo "program output" >> $TMPFILE

mktemp ফাইলটি তৈরি করবে বা একটি শূন্য-বহির্গমন স্থিতি দিয়ে প্রস্থান করবে। লজিক্যাল বা (||) নিশ্চিত করে যে এমকেটেম্প ফাইল তৈরি করতে অক্ষম হলে স্ক্রিপ্টটি প্রস্থান করবে। এই আদেশের পরে, আপনি নিশ্চিত হতে পারেন যে ফাইলটি উপলব্ধ available এটি আবার পরীক্ষা করার দরকার নেই। আপনার স্ক্রিপ্টের শেষে ফাইলটি সাফ করাতে কেবল আপনার প্রয়োজন হতে পারে।

এবং সম্ভবত স্ক্রিপ্টটি যখন একটি সিগন্যাল দ্বারা সমাপ্ত হয়। এটি প্রয়োজনীয় কি না তা আপনার সিদ্ধান্ত নিতে হবে।

trapকমান্ড ব্যবহার করে উভয়ই করা যায় ।


আহ! এটি খুব দরকারী; তাহলে আমার কল করার দরকার নেই $RANDOM। তবে আমার প্রশ্নের দ্বিতীয় অংশ part আমি কীভাবে পরে সেই ফাইলটি অ্যাক্সেস করতে পারি বা স্ক্রিপ্টটির পরবর্তী কোনও রানটিতে এটি ইতিমধ্যে উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে পারি? (খুব সাধারণ ক্যাশে প্রয়োগ করতে))
ওয়াইল্ডকার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.