जवाबों:
tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
नियमित फ़ाइल निर्माण के विपरीत, जो एक मौजूदा फ़ाइल या एक प्रतीकात्मक लिंक द्वारा अपहरण किए जाने के लिए प्रवण होता है, नाम फ़ंक्शन पाइप के माध्यम से mkfifoया अंतर्निहित फ़ंक्शन या तो निर्दिष्ट स्थान में एक नई फ़ाइल बनाता है या विफल रहता है। कुछ : >fooऐसा असुरक्षित है क्योंकि यदि हमलावर उत्पादन के बारे में अनुमान लगा सकता है mktempतो हमलावर अपने लिए लक्ष्य फ़ाइल बना सकता है। लेकिन mkfifo fooऐसे परिदृश्य में विफल होगा।
यदि आपको पूर्ण POSIX पोर्टेबिलिटी की आवश्यकता है, 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"
trap "rm -rf '$tempdir'" EXIT HUP INT TERM? क्या यह स्वयं का चर विस्तार कर सकता है?
$tempdirउस समय होगा जब trapकमांड का मूल्यांकन किया जाता है, न कि उस समय ट्रैप को ट्रिगर किया जाता है। इस मामले में, इससे कोई फर्क नहीं पड़ता, सिवाय इसके कि अगर आपका कोड tempdirएक ही उद्धरण में है, तो आपका कोड बुरी तरह टूट जाता है , जबकि मेरा कोड हमेशा काम करता है।
$tempdirस्थानीय रूप से घोषित किया गया था और जाल तक पहुँचने के लिए इसे विश्व स्तर पर परिभाषित किया जाना चाहिए। अब समझ में आता है ...
$tempdir मूल्य या तो बदल नहीं जाता है, जो मूल रूप से सभी उद्देश्यों के लिए स्वीकार्य है। बस एक ही नाम का उपयोग करने के लिए कई अस्थायी फ़ाइलों / dirs बनाने के लिए सावधान रहना होगा ...
सुरक्षित रूप से mktempएक निर्देशिका बनाने के लिए सुरक्षित विकल्प का उपयोग करना है, फिर उस निर्देशिका के अंदर अपना नामांकित पाइप डालें, rm -R $dirअंत में इसे से छुटकारा पाने के लिए करें।
mktempनिर्देशिका में FIFO बनाने का विकल्प चुना , क्योंकि यह वास्तव में एकमात्र स्वीकार्य उत्तर था, बस अगर आपने ध्यान नहीं दिया, तो @Gilles ने पहले ही इस उत्तर को गहराई से पोस्ट कर दिया।
"ड्राई-रन" विकल्प का उपयोग करें:
mkfifo $(mktemp -ut pipe.XXX)
-uविकल्प का उपयोग "प्रोत्साहित नहीं किया जाता है"।
-t, लेकिन जब तक यह मज़बूती से काम करता है, मैं इसके साथ जाऊंगा।
-tहतोत्साहित किया जाता है।
mkstemp()फ़ंक्शन ( linux.die.net/man/3/mkstemp ) को कॉल करके एक छोटा सी एप्लिकेशन बनाऊंगा । -tस्विच हतोत्साहित नहीं है, यह है -p, मेरा बुरा।
आप mktempएक अस्थायी फ़ाइल बनाने के लिए उपयोग कर सकते हैं , फिर उसे हटा सकते हैं और उसी नाम से एक नामांकित पाइप बना सकते हैं।
उदाहरण के लिए:
TMPPIPE=$(mktemp -t pipe.XXX) && {
rm -f $TMPPIPE
mkfifo $TMPPIPE
}
$TMPPIPEसे पहले mkfifo'असुरक्षित' समस्या से बचने के लिए हटाने से पहले करता है TMPPIPE=`mktemp -u` ; mkfifo $TMPPIPE?
mkfifoवास्तव में शेल से सामान्य नियमित फ़ाइल निर्माण के विपरीत सुरक्षित है। यदि यह नहीं था, तो फ़ाइल बनाना, इसे हटाना बिल्कुल भी मदद नहीं करेगा (वास्तव में यह हमलावर की नौकरी की सुविधा प्रदान करेगा, जिससे उसे फ़ाइल नाम का अनुमान लगाने की आवश्यकता नहीं होगी)। तो डॉगबैन का जवाब काम करता है, लेकिन मध्यवर्ती फ़ाइल निर्माण एक बेकार जटिलता है।
mktempमैन पेज किस संबंध में -uविकल्प को 'असुरक्षित' कहते हैं?
mktemp -dहो, फिर भी आपके इनपुट के लिए कुछ अंक मिले। आपकी सभी मदद के लिए धन्यवाद, मैं वास्तव में इसकी सराहना करता हूं!
mktemp -uएक नियमित फ़ाइल बनाते समय असुरक्षित है, क्योंकि यह सेवा से वंचित करने से सुरक्षा प्रदान करता है (यदि यह नाम पर्याप्त रूप से उत्पन्न होता है) अप्रत्याशित है, लेकिन प्रोग्राम की नाक के नीचे एक हमलावर को फ़ाइल बनाने से नहीं रोकता है। एक नियमित फ़ाइल के बजाय एक फेनो बनाना एक दुर्लभ उपयोग मामला है जिसे मैन पेज संबोधित नहीं करता है।
यूनिक्स में उपयोग करें 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
NamedPipe को केवल एक बार पढ़ने के लिए एक नियमित फ़ाइल का उपयोग किया जा सकता है।
mkfifo। यह अस्थायी नाम वाले पाइपों के बारे में मेरे सवाल को संबोधित नहीं करता है , अब से mkdirअस्थायी निर्देशिकाओं को बनाने से पता चलेगा।
mktempसंबोधित करता है जो पते को सुरक्षित रूप से नामित पाइप बनाने के लिए कहते हैं ?
mktempपरिणाम के नामपट्ट को स्वयं बना देगा (पहले अस्थायी फ़ाइल को हटाकर फिर mkfifoउसी पर चल रहा है )। mktempएक अस्थायी निर्देशिका बनाने के लिए भी इस्तेमाल किया जा सकता है, -t -dस्विच के साथ प्रयास करें।