ব্যাশে অস্থায়ী ফাইল তৈরি করা হচ্ছে


150

ব্যাশ স্ক্রিপ্টগুলিতে অস্থায়ী ফাইলগুলি তৈরি করার জন্য উদ্দেশ্যমূলকভাবে আরও ভাল উপায় আছে?

আমি সাধারণত আমার নাম যা আসে তা কেবল নামকরণ করি, যেমন টেম্পাইল -123, যেহেতু স্ক্রিপ্টটি শেষ হয়ে গেলে এটি মুছে ফেলা হবে। বর্তমান ফোল্ডারে কোনও সম্ভাব্য টেম্পাইল -123 ওভাররাইট করা ছাড়া এটি করা ছাড়া অন্য কোনও অসুবিধা আছে কি? বা আরও সতর্কতার সাথে অস্থায়ী ফাইল তৈরি করার কোনও সুবিধা আছে কি?


1
অস্থায়ীভাবে ফাইলগুলি ব্যবহার করবেন না। পরিবর্তে অস্থায়ীভাবে ডিরেক্টরি ব্যবহার করুন। এবং এমকেটেম্প ব্যবহার করবেন না। কেন এখানে দেখুন: কোডেপ্রজেক্ট
আর্টিকেলস

17
@ নিবন্ধটি পাওয়া সহজভাবে ভুল, কমপক্ষে শেল কমান্ড এমকেটেম্পে প্রয়োগ করা হলে (এমকেটেম্পের লাইব্রেরি কলটির বিপরীতে)। যেমন এমকেটেম্প একটি সীমাবদ্ধ উমাস্ক দিয়ে ফাইলটি তৈরি করে, আক্রমণকারী আক্রমণকারী হিসাবে একই অ্যাকাউন্টের অধীনে কাজ করে তবেই দেওয়া আক্রমণটি কার্যকর হয় ... এই ক্ষেত্রে গেমটি ইতিমধ্যে হারিয়ে গেছে। শেল-স্ক্রিপ্টিং বিশ্বে সেরা অনুশীলনের জন্য, mywiki.wooledge.org/BashFAQ/062
চার্লস ডাফি

আপনি tempfile(1)যে সিস্টেমে রয়েছেন তা ব্যবহার করতে পারেন ।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

উত্তর:


179

mktemp(1)মানুষ পৃষ্ঠাটি মোটামুটি ভাল ব্যাখ্যা করে:

Ditionতিহ্যগতভাবে, অনেক শেল স্ক্রিপ্টগুলি পিডের সাথে প্রোগ্রামটির নাম প্রত্যয় হিসাবে নেয় এবং এটি অস্থায়ী ফাইলের নাম হিসাবে ব্যবহার করে। এই জাতীয় নামকরণের স্কিমটি অনুমানযোগ্য এবং এটি তৈরি করা রেসের শর্তটি আক্রমণকারীর পক্ষে জয়লাভ করা সহজ। একটি নিরাপদ, যদিও এখনও নিকৃষ্ট, একই নামকরণ প্রকল্পটি ব্যবহার করে একটি অস্থায়ী ডিরেক্টরি তৈরি করা হচ্ছে approach যদিও এটির মাধ্যমে কোনওটিকে গ্যারান্টি দেওয়া যায় যে কোনও অস্থায়ী ফাইলটি বিভক্ত হবে না, তবুও এটি পরিষেবা আক্রমণ থেকে একটি সাধারণ অস্বীকারের অনুমতি দেয়। এই কারণে mktemp এর পরিবর্তে ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।

একটি স্ক্রিপ্টে, আমি এমকেটেম্পকে অনুরোধ করি

mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")

যা আমি কাজ করতে পারি এমন একটি অস্থায়ী ডিরেক্টরি তৈরি করে এবং এতে আমি নিরাপদে আসল ফাইলগুলির নাম রাখতে পারি পাঠযোগ্য এবং দরকারী কিছু।

mktempমানসম্মত নয়, তবে এটি বহু প্ল্যাটফর্মে রয়েছে। "এক্স" গুলি সাধারণত কিছু এলোমেলোভাবে রূপান্তরিত হবে এবং আরও সম্ভবত আরও এলোমেলো হবে; তবে কিছু সিস্টেম (ব্যস্তবক্স অ্যাশ, একের জন্য) অন্যদের তুলনায় এই এলোমেলোতাটিকে সীমাবদ্ধ করে


যাইহোক, কেবল শেল স্ক্রিপ্টিংয়ের চেয়ে অস্থায়ী ফাইলগুলি নিরাপদ তৈরি গুরুত্বপূর্ণ। এজন্য পাইথনটিতে টেম্পাইল হয় , পার্লের ফাইল থাকে :: টেম্প , রুবিতে টেম্পাইল থাকে ইত্যাদি…



7
দেখে মনে হচ্ছে এটি সবচেয়ে নিরাপদ এবং সর্বাধিক ক্রস-প্ল্যাটফর্ম mktempউপায়টি এর basenameমতো সংমিশ্রণে রয়েছে mktemp -dt "$(basename $0). XXXXXXXXXX"। আপনি যদি ব্যবহার না করেন তবে basenameএই এমকেটেম্পের মতো একটি ত্রুটি পেতে পারে : অবৈধ টেম্পলেট, `/tmp/MOB-SAN-JOB1-183-ScriptBuildTask-7300464891856663368.sh.XXXXXXXXXXX 'ডিরেক্টরিতে পৃথক পৃথক রয়েছে
i4niac

7
তারা টাইপ করুন (অতিরিক্ত স্থান) উপেক্ষা করুন। mktemp -dt "$(basename $0).XXXXXXXXXX"সঠিক উপায়।
i4niac

3
@ i4niac: আপনি প্রয়োজন যে উদ্ধৃত করা $0, স্পেস OS X এর দেশে একটা প্রচুর আছেmktemp -dt "$(basename "$0").XXXXXX"
Orwellophile

11
এছাড়াও স্ক্রিপ্ট সম্পাদনের শেষে trap "rm -rf $mydir" EXIT
টেম্পিডিরটি

43

হ্যাঁ, এমকেটেম্প ব্যবহার করুন

এটি কোনও ফোল্ডারের অভ্যন্তরে একটি অস্থায়ী ফাইল তৈরি করবে যা অস্থায়ী ফাইলগুলি সংরক্ষণের জন্য ডিজাইন করা হয়েছে এবং এটি আপনাকে একটি অনন্য নামের গ্যারান্টি দেবে। এটি সেই ফাইলটির নাম দেয়:

> mktemp
/tmp/tmp.xx4mM3ePQY
>

19

আপনি দেখতে চাইবেন mktemp

Mktemp ইউটিলিটি প্রদত্ত ফাইলের নাম টেমপ্লেট নেয় এবং একটি অনন্য ফাইল নাম তৈরি করতে এর একটি অংশকে ওভাররাইট করে। টেমপ্লেটটি এতে কিছু সংখ্যক 'এক্স' যুক্ত যুক্ত ফাইলের নাম হতে পারে, উদাহরণস্বরূপ /tmp/tfile.XXXXXXXXXX। চলমান 'এক্সস' বর্তমান প্রক্রিয়া নম্বর এবং এলোমেলো অক্ষরের সংমিশ্রণে প্রতিস্থাপন করা হয়।

আরও তথ্যের জন্য: man mktemp


11

আরও সতর্কতার সাথে অস্থায়ী ফাইল তৈরি করার কোনও সুবিধা আছে কি?

অস্থায়ী ফাইলগুলি সাধারণত অস্থায়ী ডিরেক্টরিতে তৈরি করা হয় (যেমন /tmp) যেখানে অন্যান্য সমস্ত ব্যবহারকারী এবং প্রক্রিয়া অ্যাক্সেস পড়তে এবং লিখতে পারে (অন্য কোনও স্ক্রিপ্ট সেখানে নতুন ফাইল তৈরি করতে পারে)। সুতরাং স্ক্রিপ্টে ফাইলগুলি তৈরি করতে যেমন সঠিক অনুমতি ব্যবহার করা সম্পর্কে সতর্কতা অবলম্বন করা উচিত (যেমন কেবলমাত্র মালিকের জন্য পড়ুন, দেখুন help umask:) এবং ফাইলের নাম সহজেই অনুমান করা উচিত নয় (আদর্শভাবে এলোমেলো)। অন্যথায় যদি ফাইলের নামগুলি অনন্য না হয় তবে এটি একই স্ক্রিপ্টের সাথে একাধিকবার দৌড়াদৌড়ি তৈরি করতে পারে (যেমন রেস শর্ত)) অথবা কিছু আক্রমণকারী হয় কিছু সংবেদনশীল তথ্য হাইজ্যাক করতে পারে (যেমন অনুমতিগুলি খুব বেশি উন্মুক্ত থাকে এবং ফাইলের নাম অনুমান করা সহজ) বা কোডটি নিজস্ব সংস্করণ দিয়ে ফাইলটি তৈরি / প্রতিস্থাপনের মতো (যেমনটি হচ্ছে তার উপর নির্ভর করে কমান্ড বা এসকিউএল কোয়েরিগুলি প্রতিস্থাপনের মতো) সঞ্চিত)।


অস্থায়ী ডিরেক্টরি তৈরি করতে আপনি নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন:

TMPDIR=".${0##*/}-$$" && mkdir -v "$TMPDIR"

বা অস্থায়ী ফাইল:

TMPFILE=".${0##*/}-$$" && touch "$TMPFILE"

তবে এটি এখনও অনুমানযোগ্য এবং নিরাপদ হিসাবে বিবেচিত নয়।

হিসাবে man mktemp, আমরা পড়তে পারেন:

Ditionতিহ্যগতভাবে, অনেক শেল স্ক্রিপ্টগুলি পিডের সাথে প্রোগ্রামটির নাম প্রত্যয় হিসাবে নেয় এবং এটি অস্থায়ী ফাইলের নাম হিসাবে ব্যবহার করে। এই জাতীয় নামকরণের স্কিমটি অনুমানযোগ্য এবং এটি তৈরি করা রেসের শর্তটি আক্রমণকারীর পক্ষে জয়লাভ করা সহজ।

সুতরাং নিরাপদে mktempথাকার জন্য, অনন্য অস্থায়ী ফাইল বা ডিরেক্টরি তৈরি করতে কমান্ডটি ব্যবহার করার পরামর্শ দেওয়া হয় -d


2
ঠিক কি জিজ্ঞাসা করা হয়েছিল। তবুও, এটি একটি নিখুঁত সমাধান হতে পারে।
jpbochi

1
@jpbochi আমি প্রশ্নের উত্তর দেওয়ার জন্য উত্তরটি উন্নত করেছি। যদি এটি সাহায্য করে তবে আমাকে জানান।
কেনোরব

2
এটি সত্যই উত্তর উন্নতি করে। যদিও আমার উক্তিটি ইতিমধ্যে আপনার ছিল। বেশি ভোট দিতে পারবেন না। আমার একটি পরামর্শ হ'ল কী তা ব্যাখ্যা করা ${0##*/}এবং এর মধ্যে কীভাবে $$প্রসারিত করা, বা এটি সম্পর্কে কোনও ডকুমেন্টেশনের লিঙ্ক।
jpbochi

0

mktemp সম্ভবত সবচেয়ে বহুমুখী, বিশেষত যদি আপনি কিছু সময়ের জন্য ফাইলটি নিয়ে কাজ করার পরিকল্পনা করেন।

আপনি যদি কেবলমাত্র অন্য একটি কমান্ডের ইনপুট হিসাবে অস্থায়ীভাবে ফাইলের প্রয়োজন হয় তবে আপনি একটি প্রক্রিয়া বিকল্প অপারেটরও ব্যবহার করতে পারেন <():

$ diff <(echo hello world) <(echo foo bar)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.