मैं शेल स्क्रिप्ट से अस्थायी फ़ाइलों को सुरक्षित रूप से कैसे बना और एक्सेस कर सकता हूं?


14

मैंने पढ़ा है कि एक निश्चित नाम फ़ाइल में आउटपुट पुनर्निर्देशित करना एक /tmpसुरक्षा जोखिम हो सकता है, क्योंकि यदि कोई हमलावर (या दुर्भावनापूर्ण) नोटिस करता है कि /tmp/tmpfileformyscript.tmpजब मैं अपनी स्क्रिप्ट चलाता हूं, तो एक फ़ाइल बनाई जाती है (भले ही वह मेरे लिए पढ़ी गई पहुंच न हो) स्क्रिप्ट), वह उदाहरण के लिए एक सिम्लिंक बना ln -s ~wildcard/.bashrc /tmp/tmpfileformyscript.tmpसकता है जो मुझे .bashrcअपनी स्क्रिप्ट चलाने पर अपनी फ़ाइल को नष्ट करने का कारण बनेगा ।

इसलिए इसके बजाय मैं कुछ का उपयोग कर सकते हैं filename="tmpfile.tmp.$RANDOM" ; echo outputtext > "$filename"

हालाँकि, मैं कभी-कभी कैशिंग के लिए एक tmp फ़ाइल का उपयोग करना चाहूँगा, इस स्थिति में मैं जानना चाहूँगा कि क्या "tmpileile.tmp। *" कुछ भी मेल खाता है /tmpऔर यदि ऐसा है, तो नया बनाने के बजाय उस फ़ाइल का उपयोग करें। दुर्भाग्य से testऔर बराबर [ -f filename ]फ़ाइल ग्लोबिंग का समर्थन नहीं करता है जहाँ तक मैं बता सकता हूँ।

इस प्रकार मेरा सवाल दुगना है:

  1. मैं सुरक्षित रूप से टेम्पोफाइल कैसे बना सकता हूं? क्या "predictablename.$RANDOM"एक स्वीकार्य अभ्यास है या बेहतर (अधिक सुरक्षित, आसान) तरीका है?
  2. मैं फ़ाइल को आसानी से कैसे एक्सेस कर सकता / सकती हूं और / या बाद में जाँच कर अपना अस्तित्व स्थापित कर सकती हूँ predictablename?

जवाबों:


13

mktempएक अप्रत्याशित नाम के साथ एक अस्थायी फ़ाइल बनाने के लिए उपयोगिता का उपयोग करें । यह POSIX द्वारा मानकीकृत नहीं है, लेकिन यह * BSD के साथ-साथ लिनक्स पर भी उपलब्ध है।

> /tmp/predictable.$RANDOMयह एक अच्छा विकल्प नहीं है क्योंकि यह ज्यादातर प्रेडिक्टेबल है, जो आपकी स्क्रिप्ट को एक हमले के लिए खोलता है जहां हमलावर आपकी स्क्रिप्ट को उस फ़ाइल में ओवरराइट कर सकता है जिसे आपने लिखा है, या अस्थायी फ़ाइल तक पहुंच प्रदान कर रहा है। यह एक असुरक्षित अस्थायी फ़ाइल भेद्यता है। mktempयह भेद्यता नहीं है क्योंकि फ़ाइल को सुरक्षित रूप से बनाता है (यह एक मौजूदा फ़ाइल को अधिलेखित नहीं करेगा, भले ही प्रतीकात्मक लिंक शामिल हों) और सेवा से इनकार करने से बचने के लिए पर्याप्त रूप से अप्रत्याशित नाम का उपयोग करता है।

यदि एक अस्थायी फ़ाइल बनाना और उसके साथ काम करना बहुत अच्छा नहीं है, तो एक अस्थायी निर्देशिका बनाएं mktemp -dऔर उसमें काम करें।

mktemp$TMPDIRचर का सेट होने पर उपयोग करने के लिए भी ध्यान रखता है, /tmpअगर यह परेशान है तो वापस गिरता है ।

अधिक से अधिक वितरण TMPDIRएक निजी निर्देशिका होने के लिए सेट किए जाते हैं , जैसे /run/1234/tmpकि 1234आपका UID कहां है। यह अस्थायी फ़ाइल कमजोरियों के जोखिम को समाप्त करता है, अब उपयोगकर्ताओं के बीच अस्थायी फ़ाइलों को साझा करने में सक्षम होने की लागत पर (जो कभी-कभी उपयोगी है, लेकिन बहुत बार नहीं है; /tmpअभी भी उपलब्ध है, बस नहीं TMPDIR)।

यदि आपको एक प्रतिलिपि प्रस्तुत करने योग्य फ़ाइल नाम की आवश्यकता है, तो उपयोगकर्ता के घर निर्देशिका के तहत एक अच्छी तरह से परिभाषित नाम (कोई यादृच्छिक घटक के साथ) के साथ एक फ़ाइल बनाएं। आधुनिक सम्मेलन XDG उपयोगकर्ता निर्देशिका विनिर्देश है । यदि डेटा हानि के बिना फ़ाइल को हटाया जा सकता है, तो 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 का मंच randस्टार्टअप के समय का बीज है। ATT Ksh का मंच randपीआईडी ​​द्वारा वरीयता प्राप्त है। Mksh एक अधिक जटिल के साथ एक LCG है, लेकिन अभी भी सुरक्षा-गुणवत्ता वाला बीज नहीं है। उन सभी को सफलता की काफी बड़ी संभावना के साथ एक और प्रक्रिया द्वारा भविष्यवाणी की जा सकती है।


वास्तव में आपकी चर्चा $TMPDIRऔर ~/.cacheवास्तव में वही है जिसकी मुझे आवश्यकता थी। कुछ और सोचने के बाद मुझे एहसास हुआ कि इसका एकमात्र कारण मैं चाहता था कि इसमें /tmpविभाजन हो - इसलिए कैश विभाजन को नहीं भर सका /home। लेकिन इस उपयोग के मामले के लिए जो वास्तव में एक पूर्ण गैर-मुद्दा है, इसलिए ~/.cacheमेरी आवश्यकताओं को पूरी तरह से फिट करने का एक उपनिर्देशिका और सुरक्षा मुद्दे से बचा जाता है।
वाइल्डकार्ड 13

mktempविंडोज पर AIX या Git शेल पर उपलब्ध नहीं है। ऐसा लगता file.$RANDOM$RANDOMहै कि पोर्टेबल समाधान है। $RANDOM$RANDOM2 ^ 32 को अंतरिक्ष वृद्धि करनी चाहिए, यह मानते हुए बैश यादृच्छिक परिणाम स्वतंत्र और कमजोर नहीं हैं।

@jww बैश के यादृच्छिक परिणाम कमजोर हैं: यह एक एलसीजी है, जो कि कई अनुप्रयोगों के लिए काफी अच्छा होने के साथ-साथ अप्रत्याशित होने की संभावना के बारे में है जो अप्रत्याशित नहीं है।
गिल्स एसओ- बुराई को रोकना '25

9

mktemp को इसके लिए डिज़ाइन किया गया था। मैन पेज से:

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

mktemp फ़ाइल बना देगा या गैर-शून्य निकास स्थिति के साथ बाहर निकल जाएगा। तार्किक या (||) यह सुनिश्चित करता है कि स्क्रिप्ट फ़ाइल बनाने में असमर्थ है तो स्क्रिप्ट बाहर निकल जाएगी। इस आदेश के बाद, आप सुनिश्चित कर सकते हैं कि फ़ाइल उपलब्ध है। इसे फिर से जाँचने की कोई आवश्यकता नहीं है। केवल एक चीज जो आपको जोड़ने की आवश्यकता हो सकती है वह है आपकी स्क्रिप्ट के अंत में फ़ाइल की सफाई।

और संभवतः तब भी जब स्क्रिप्ट सिग्नल द्वारा समाप्त हो जाती है। यह जरूरी है या नहीं, यह आपको तय करना है।

दोनों trapकमांड का उपयोग करके किया जा सकता है ।


आह! यह बहुत उपयोगी है; फिर मुझे फोन करने की जरूरत नहीं है $RANDOM। लेकिन फिर मेरे सवाल का हिस्सा 2 - मैं उस फ़ाइल को बाद में कैसे एक्सेस कर सकता हूं या चेक कर सकता हूं कि क्या यह स्क्रिप्ट के बाद के रन पर पहले से मौजूद है? (एक बहुत ही सरल कैश को लागू करने के लिए।)
वाइल्डकार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.