শেল স্ক্রিপ্ট এমকেটেম্প, অস্থায়ী নামযুক্ত পাইপ তৈরির সেরা পদ্ধতি কোনটি?


30

আমি অস্থায়ী ফাইলগুলি তৈরি করা সবচেয়ে ভাল জানি mktemp, তবে নামযুক্ত পাইপগুলির কী হবে?

আমি জিনিসগুলিকে যতটা সম্ভব পসিক্সের সাথে সঙ্গতিপূর্ণ হতে পছন্দ করি তবে লিনাক্স কেবল গ্রহণযোগ্য। বাশিজম এড়ানো আমার একমাত্র কঠোর মানদণ্ড, যেমন আমি লিখি dash

উত্তর:


41
tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"

নিয়মিত ফাইল তৈরির বিপরীতে, যা বিদ্যমান ফাইল বা একটি প্রতীকী লিঙ্ক দ্বারা হাইজ্যাক হওয়ার প্রবণতাযুক্ত, নাম পাইপ তৈরি mkfifoবা অন্তর্নিহিত ফাংশনটির মাধ্যমে নির্দিষ্ট জায়গায় নতুন ফাইল তৈরি হয় বা ব্যর্থ হয়। এর মতো : >fooকিছু অনিরাপদ কারণ আক্রমণকারী যদি তার ফলাফলের পূর্বাভাস দিতে পারে mktempতবে আক্রমণকারী নিজের জন্য লক্ষ্য ফাইলটি তৈরি করতে পারে। তবে mkfifo fooএমন পরিস্থিতিতে ব্যর্থ হবে।

আপনার যদি পূর্ণ পসিক্স বহনযোগ্যতা দরকার mkfifo -m 600 /tmp/myfifoহয় তবে হাইজ্যাকিংয়ের বিরুদ্ধে নিরাপদ তবে পরিষেবা অস্বীকারের ঝুঁকিতে রয়েছে; একটি শক্তিশালী এলোমেলো ফাইলের নাম জেনারেটর অ্যাক্সেস ছাড়াই আপনার পুনরায় চেষ্টা প্রচেষ্টা পরিচালনা করতে হবে।

আপনি যদি অস্থায়ী ফাইলগুলির চারপাশে সূক্ষ্ম সুরক্ষা সমস্যার জন্য যত্ন না পান তবে আপনি একটি সাধারণ নিয়মটি অনুসরণ করতে পারেন: একটি ব্যক্তিগত ডিরেক্টরি তৈরি করুন এবং সেখানে সবকিছু রাখুন।

tmpdir=
cleanup () {
  if [ -n "$tmpdir" ] ; then rm -rf "$tmpdir"; fi
  if [ -n "$1" ]; then kill -$1 $$; fi
}
tmpdir=$(mktemp -d)
trap 'cleanup' EXIT
trap 'cleanup HUP' HUP
trap 'cleanup TERM' TERM
trap 'cleanup INT' INT
mkfifo "$tmpdir/pipe"

আমি গতকাল এর আগে আমার সমাধান হিসাবে এটি ইতিমধ্যে বেছে নিয়েছি, কেউ এটি পোস্ট করেছে কিনা সেটার জন্য আমি অপেক্ষা করছিলাম, বা আরও ভাল। আমি অনুভব করেছি যে আমার ক্ষেত্রে দির যাওয়ার উপায় ছিল। নির্বিশেষে ... সহায়তার জন্য ধন্যবাদ, আমি এটির প্রশংসা করি।
জেএম বেকার

1
ট্র্যাপ কমান্ড হওয়া উচিত নয় trap "rm -rf '$tempdir'" EXIT HUP INT TERM? এটির নিজস্ব পরিবর্তনশীল প্রসারণ ফাঁদ পেতে পারে?
ছয়

@ সিক্স আপনার কমান্ডটি কমান্ডটি মূল্যায়নের $tempdirসময় প্রসারিত হবে trap, ফাঁদটি ট্রিগার হওয়ার সময় নয়। এই ক্ষেত্রে, এটি কোনও তফাত্ করবে না, আপনার কোডটি ভয়াবহভাবে ভেঙে যায় যদি এর মানটিতে tempdirএকটি কোট থাকে তবে আমার কোড সর্বদা কার্যকর হয়।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গিলস এটি একটি দুর্দান্ত বৈশিষ্ট্য। আমি ভাগ্য ছাড়াই আপনার একক উদ্ধৃতি উদাহরণ ব্যবহার করে দেখেছি, তাই আমি ভেবেছিলাম ফাঁস রানটাইমের সময় ভেরিয়েবলগুলি মূল্যায়ন করতে অক্ষম। দেখা গেল যে $tempdirস্থানীয়ভাবে আমার ঘোষিত হয়েছিল এবং ফাঁদে এটির অ্যাক্সেস পাওয়ার জন্য এটি অবশ্যই বিশ্বব্যাপী সংজ্ঞায়িত করা উচিত। এখনই বোঝায় ...
ছয়

1
@ গিলস ... যতক্ষণ না $tempdir মানের কোনও পরিবর্তন হয় না, যা মূলত সমস্ত উদ্দেশ্যেই গ্রহণযোগ্য। একাধিক টেম্প ফাইল /
ডায়ার

3

একটি নিরাপদ বিকল্প হ'ল mktempডিরেক্টরিটি নিরাপদে তৈরি করার জন্য ব্যবহার করা হয়, তারপরে আপনার নামের পাইপটিকে সেই ডিরেক্টরিতে রেখে দিন, rm -R $dirশেষ পর্যন্ত এটি থেকে মুক্তি পেতে একটি করুন ।


আমি একটি mktempডিরেক্টরিতে ফিফো তৈরির সিদ্ধান্ত নিয়েছিলাম , কারণ এটিই ছিল সত্যিকারের একমাত্র গ্রহণযোগ্য উত্তর, যদি আপনি খেয়াল না করেন, @ গিলিস ইতিমধ্যে এই উত্তরটি গভীরভাবে পোস্ট করেছেন।
জেএম বেকার

2

"ড্রাই-রান" বিকল্পটি ব্যবহার করুন:

mkfifo $(mktemp -ut pipe.XXX)

1
ম্যান পেজ অনুসারে, -uবিকল্পটির ব্যবহার "উত্সাহিত নয়"।
ডগবনে

@ ডগবনে তাই এর ব্যবহার -t, তবে যতক্ষণ না এটি নির্ভরযোগ্যভাবে কাজ করবে আমি ততক্ষণ তা দিয়ে যাব।
পোলেমন

দুঃখিত, এটি কোথায় -tনিরুৎসাহিত হয়েছে বলে?
ডগবনে

2
@ ডগবনে যদি এটি কোনওভাবেই সমালোচনামূলক হয় তবে আমি একটি ছোট সি অ্যাপ্লিকেশন তৈরি করব, mkstemp()ফাংশনটি কল করে ( linux.die.net/man/3/mkstemp )। -tসুইচ নিরুৎসাহিত করা হয় না, তা না হয় -p, আমার খারাপ।
পোলেমন

1

আপনি mktempএকটি অস্থায়ী ফাইল তৈরি করতে ব্যবহার করতে পারেন , তারপরে এটি মুছুন এবং একই নামের সাথে একটি নামক পাইপ তৈরি করুন।

উদাহরণ স্বরূপ:

TMPPIPE=$(mktemp -t pipe.XXX) && {
    rm -f $TMPPIPE
    mkfifo $TMPPIPE
}

'অনিরাপদ' সমস্যাটি এড়ানোর $TMPPIPEআগে কী মুছে ফেলা হবে ? mkfifoTMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE
জেএম বেকার

1
mkfifoশেল থেকে নিয়মিত ফাইল তৈরির বিপরীতে @ টেকজিলা আসলে নিরাপদ। যদি এটি না হয় তবে কোনও ফাইল তৈরি করে তা মুছে ফেলা মোটেই সহায়তা করবে না (প্রকৃতপক্ষে আক্রমণকারীর ফাইলটিকে ফাইলের নামটি অনুমান করার প্রয়োজন নেই তার দ্বারা এটি ব্যাপকভাবে সহায়তা করবে)। সুতরাং কুকুরবাণীর উত্তরটি কাজ করে তবে মধ্যবর্তী ফাইল তৈরি করা একটি অকেজো জটিলতা।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

1
@ গিলিস, আপনি কি জানেন যে mktempম্যান পেজটি -u'অনিরাপদ' বিকল্পটিকে ডাকে ?
জেএম বেকার

@ ডগবনে, আমি আপনার উত্তরে ভোট দিয়েছি এবং আপনার মন্তব্যগুলি আমার কাছে দৃ .় মনে হয়েছে। যদিও, আমি ইতিমধ্যে এটি গতকালই সম্পন্ন করেছি .. আমি যখন অপেক্ষা করছিলাম তখন কেউ আমার সমাধান পোস্ট করেন বা আশা করি এর থেকে আরও ভাল। যদিও আমি ব্যবহার করেছি mktemp -dআপনি এখনও আপনার ইনপুট জন্য কিছু পয়েন্ট পেয়েছি। আপনার সমস্ত সহায়তার জন্য আপনাকে ধন্যবাদ, আমি সত্যিই এটির প্রশংসা করি!
জেএম বেকার

1
mktemp -uনিয়মিত ফাইল তৈরি করার সময় @ টেকজিলা অনিরাপদ, কারণ এটি পরিষেবা অস্বীকারের বিরুদ্ধে সুরক্ষা সরবরাহ করে (এটি যে নামটি উত্পন্ন করে তা যথেষ্ট পরিমাণে অনাকাঙ্ক্ষিত) তবে প্রোগ্রামটির নাকের নীচে আক্রমণকারীকে ফাইল তৈরি করতে বাধা দেয় না। একটি নিয়মিত ফাইলের পরিবর্তে ফিফো তৈরি করা বিরল ব্যবহারের ঘটনা যা ম্যান পৃষ্ঠাটি সম্বোধন করে না।
গিলস

0

ব্যবহারের mkfifoবা mknodইউনিক্স, যেখানে দুটি পৃথক প্রক্রিয়ায় নামে নল অ্যাক্সেস করতে পারেন - একজন লেখক হিসেবে অন্যটি প্রক্রিয়া একটি পাঠক হিসাবে এটি খোলার করতে পারেন।

mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz
cat file > my_pipe

নামক পাইপটি যে কোনও ফাইলের মতোই মোছা যাবে:

rm my_pipe

mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe

নামযুক্ত পাইপ একবারে কেবল পড়ার জন্য নিয়মিত ফাইল ব্যবহার করা যেতে পারে।

http://www.linuxjournal.com/article/2156


2
আমি নামী পাইপ সম্পর্কে সম্পূর্ণ সচেতন, এবং mkfifo। এটি অস্থায়ী নামের পাইপগুলি সম্পর্কে আমার প্রশ্নের সমাধান করে না , mkdirঅস্থায়ী ডিরেক্টরিগুলি তৈরি করার ঠিকানা ছাড়া আর ।
জেএম বেকার

2
নিরাপদে একটি নামযুক্ত পাইপ তৈরি mktempকরতে যে বিষয়গুলি সম্বোধন করে এটি কীভাবে এই সমস্যার সমাধান করে ?
ক্যামহ

1
ওহ, ঠিক আছে এগুলি / টিএমপি এর আওতায় তৈরি করা সবচেয়ে ভাল, তারা সংজ্ঞা অনুসারে অস্থায়ী ফাইল এবং সিস্টেমটি পুনরায় চালু হওয়ার পরে তা সাফ হয়ে যায়। বা আরও ভাল, একটি শেল ফাংশন রয়েছে যা mktempফলাফলটি নিজেই নেমপাইপ তৈরি করবে (প্রথমে টেম্প ফাইলটি মোছার পরে অবশ্যই চালানো mkfifoহবে)। mktempএকটি অস্থায়ী ডিরেক্টরি তৈরি করতেও ব্যবহার করা যেতে পারে, -t -dস্যুইচ দিয়ে চেষ্টা করুন ।
নিখিল মুলি 24'12
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.