पुनर्निर्देशन के बिना एक फ़ाइल में लिखें?


13

मैं एक नियमित रूप से संकलित एप्लिकेशन लिख रहा हूं जिसे एक विशेष फ़ाइल बनाने और उसमें एक मैजिक कुकी लिखने की आवश्यकता है। मैं सीधे एप्लिकेशन से फ़ाइल नहीं लिख सकता, सिस्टम सुरक्षा मॉडल को चाल करने के लिए उन्नत विशेषाधिकारों के साथ एक सहायक उपकरण लॉन्च करने की आवश्यकता है। मैं सहायक उपकरण को किसी भी तर्क की आपूर्ति कर सकता हूं। अब मैं कुछ बहुत ही सरल सिस्टम कमांड चुनना चाहूंगा जो सहायक उपकरण के रूप में काम करेगा और मेरे लिए फाइल बनाएगा। कुछ इस तरह:

/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"

सरल touchइसे काट नहीं करता है क्योंकि मुझे फ़ाइल में कुकी लिखने की आवश्यकता है, echoशेल आवरण के बिना एक सरल काम नहीं करता है क्योंकि इसे फ़ाइल को लिखने के लिए पुनर्निर्देशन की आवश्यकता होती है। इस तरह के तुच्छ कार्य को करने के लिए मैं विशेषाधिकारों के साथ शेल को कॉल करने में सहज महसूस नहीं करता। क्या वास्तव में कुछ सरल, विवश सिस्टम कमांड है जो मुझे मेरे लिए फाइल लिखने के लिए कह सकता है?


क्या कोई कारण /bin/sh -c 'echo magic > /path/to/magic/file'है जो काम नहीं करता है? यह एक निष्पादन योग्य फ़ाइल और दो तर्क होंगे। आपको अंतिम तर्क को एक स्ट्रिंग (स्प्रिंटफ या समकक्ष के साथ) के रूप में बनाने की आवश्यकता होगी। क्या यह कारण है कि यह आपके लिए काम नहीं करेगा? आपके प्रश्न से ऐसा लगता है जैसे doCommandAsRoot () कमांड को स्ट्रीम करने के लिए इनपुट नहीं लेता है, सही है? अन्यथा आप 'cat > /path/to/magic/file'एक स्ट्रिंग बनाने के बजाय अंतिम तर्क को बदल सकते हैं और डेटा पास कर सकते हैं।
Arcege

शेल उदाहरण काम करता है, लेकिन मैं एक साधारण फ़ाइल बनाने के लिए शेल को रूट विशेषाधिकारों के साथ कॉल करने से नफरत करता हूँ। पुस्तकालय एक संचार पाइप तर्क लेता है (यह प्राधिकरण है ।ecuteWithPrivileges ), जिसका उपयोग कुकर का उपयोग लिखने के लिए किया जा सकता है tee। धन्यवाद!
जूल 17

यह भी देखें stackoverflow.com/a/18146890/2032064
Mifeet

जवाबों:


11

इस बारे में कैसा है:

echo -n 'magic' | sudo tee /some/where/file > /dev/null

यकीन है कि इसमें पुनर्निर्देशन हैं, लेकिन केवल टी के रूप में चलता है जड़ नहीं है। के साथ dd of=...भी काम करता है।


2
क्षमा करें, मुझे स्पष्ट रूप से हाल ही में खुद को समझाने में परेशानी है। समस्या यह है कि जब मैं एलिवेटेड विशेषाधिकारों के साथ कुछ चलाना चाहता हूं, तो मुझे एक विशेष पुस्तकालय कॉल (कुछ ऐसा doCommandAsRoot) के माध्यम से जाना होगा । और यह फ़ंक्शन केवल कमांड और इसके तर्कों के लिए एक रास्ता स्वीकार करता है, इसलिए मेरे लिए आउटपुट पुनर्निर्देशन का तुरंत उपयोग करने का कोई तरीका नहीं है। मैं शेल के माध्यम से जा सकता था (जैसा कि प्रश्न में दिखाया गया है), लेकिन मुझे वह सुरक्षा-वार पसंद नहीं है।
zoul

@ ज़ूल: मुझे लगा कि आप एक शेल स्क्रिप्ट लिख रहे हैं। क्या मैजिक कुकी को किसी ऐसी फ़ाइल में लिखना ठीक है जो अप्रकाशित प्रक्रियाओं के लिए सुलभ हो? अगर ऐसा है तो इसे ऐसी फाइल में लिख दें और कॉल करें doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file")
स्ट्राइबिका

नहीं, यह एक नियमित संकलित अनुप्रयोग (अपडेट किया गया प्रश्न) है। मैं बस "शेल" कमांड की तलाश कर रहा हूं ताकि वह सहायक के रूप में सेवा कर सके ताकि मुझे इसे स्वयं लिखने की जरूरत न पड़े। हां, कुकी संवेदनशील नहीं है। ddउदाहरण के बहुत जो मैं चाहता के करीब है, धन्यवाद। क्या आप कुछ सरल भी सोच सकते हैं?
zoul

ज़रूर - आप उपयोग कर सकते हैं cpया mvइसके बजाय dd
mattdm 16

मेरा मतलब है सरल के रूप में कॉपी करने की आवश्यकता के बिना :)
zoul

9

आउटपुट के बिना पुनर्निर्देशित, बिना पाइप के, लेकिन "यहां स्ट्रिंग" के साथ:

dd of=/some/where/file <<<'magic'

इस दृष्टिकोण के एक पक्ष dd कुछ आँकड़े stdout को लिखता है। आप उन्हें छिपाने के लिए> / dev / null का उपयोग कर सकते हैं, लेकिन उस समय आप टी का उपयोग कर सकते हैं।
स्टडजेक

1
इसने मेरे लिए एक असामान्य स्थिति में काम किया जहां मैं आउटपुट पुनर्निर्देशन या पाइप का उपयोग नहीं कर सका। status=noneGNU कोरुटिल्स के आधुनिक संस्करणों से अन्य सभी आउटपुट को दबा देगा dd
माइकल हैम्पटन

5

एक और विचार है, जो यह है कि आप जादू कुकी के मूल्य को कमांड लाइन पर नहीं रखना चाहते हैं, क्योंकि यह अन्य उपयोगकर्ताओं द्वारा देखा जा सकता है। भले ही कार्यक्रम अल्पकालिक हो (यदि प्रोग्राम कमांड लाइन स्ट्रिंग को शून्य करता है), तो हमले का अवसर है। तो, एक सैद्धांतिक:

writestringtofile 'magic' /some/where/file

एक खतरनाक तरीका है। इसलिए, मैं @ stribika के सुझाव का समर्थन करता हूं: एक अस्थायी फ़ाइल का मान लिखें और इसे जगह पर कॉपी करें। अस्थायी फ़ाइल ( mkstemp()) बनाने के लिए एक सुरक्षित फ़ंक्शन का उपयोग करना सुनिश्चित करें ताकि वहां भी रेस की स्थिति न हो।


धन्यवाद, यह एक उपयोगी चर्चा है। सौभाग्य से "मैजिक कुकी" एक सुरक्षा उपकरण नहीं है, यह किसी के द्वारा भी स्पष्ट रूप से देखा जा सकता है।
ज़ूल

0

स्पंज से अधिक थूक - मानक इनपुट को सोखें और एक फाइल पर लिखें:

echo -n 'magic' | sponge /some/where/file

शेल पुनर्निर्देशित के विपरीत, स्पंज आउटपुट फाइल लिखने से पहले अपने सभी इनपुट को भिगो देता है। जब संभव हो, स्पंज अस्थायी रूप से जगह में एक अस्थायी फ़ाइल का नाम बदलकर आउटपुट फ़ाइल बनाता है या अपडेट करता है।

देखें और अधिक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.