आउटपुट रीडायरेक्ट करते समय विशिष्ट फ़ाइल अनुमतियां कैसे सेट करें?


12

यह शायद एक डुप्लिकेट है, लेकिन मेरी सभी खोजें अनुमति अस्वीकृत त्रुटियों के बारे में सवाल उठा रही हैं।

मैं बैश शेल में एक कमांड चला रहा हूं। मैं आउटपुट को रीडायरेक्ट करने के लिए एक फ़ाइल में जोड़ना चाहता हूं जो संभवतः पहले रन पर मौजूद नहीं है। मैं विशिष्ट फ़ाइल अनुमतियाँ मोड सेट करना चाहता हूं यदि आउटपुट पुनर्निर्देशन के लिए यह फ़ाइल बनाना है। क्या एक कमांड के साथ ऐसा करने का कोई तरीका है?

उदाहरण के लिए, मैं कोशिश कर सकता हूं

foo >> /tmp/foo.log 0644

0644मैं कहां से अनुमति लेना चाहता हूं foo.log। अधिकांश आदेशों को मैंने बैश के साथ प्रयोग किया है 0644ताकि एक अतिरिक्त तर्क के रूप में व्याख्या की जा सके foo

मुझे यह महसूस होता है कि यह chmodलिखने से पहले या बाद में अनुमति के लिए एक दूसरी कमांड लेने जा रहा है।

मैं GNU बैश 4.2.25 और Ubuntu 12.04 का उपयोग कर रहा हूँ, अगर इससे कोई फर्क पड़ता है - सामान्य उत्तर पसंद किए जाते हैं।

जवाबों:


5

जहाँ तक मुझे पता है, पाइपिंग करते समय ऐसा करने का कोई तरीका नहीं है, एक सरल स्क्रिप्ट सबसे अच्छा समाधान हो सकती है।

if [ -e /tmp/foo.log ]; then
    foo >> /tmp/foo.log
else
    foo >> /tmp/foo.log
    chmod 0644 /tmp/foo.log
fi

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

3
इस दृष्टिकोण के साथ समस्या यह है कि यह कम समय विंडो बनाता है जब फ़ाइल पर अनुमतियाँ गलत होती हैं। यदि संवेदनशील डेटा की सुरक्षा करना लक्ष्य है, तो मैं इसका उपयोग नहीं करूंगा।
१४:०४

1
यह उत्तर काम करता है, जहाँ तक यह जाता है, लेकिन @proski सही है: umaskउत्तर बेहतर हैं, और उनमें से एक को स्वीकार किया जाना चाहिए।
स्कॉट

15

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं अपने दो सेंट जोड़ना चाहता था।

मेरे पास एक ही विचार था और बोल्ससीआर के समान समाधान के साथ आया था । उनके समाधान के साथ समस्या यह थी कि fooअगर मैं इसे चलाने से पहले umask को बदल देता हूं तो मेरी कमांड ( ) काम नहीं करेगी, इसलिए यह मेरी समस्या है:

foo | ( umask 0033; cat >> /tmp/foo.log; )

यहाँ, umaskकेवल foo.logउपनिर्देश में पुनर्निर्देशन को प्रभावित करता है । बाकी सब कुछ अप्रभावित रहता है।

थोड़ा दृढ़, लेकिन यह काम करता है।


बहुत अच्छा और प्रभावी :) बस stdout redir के शीर्ष पर stderr पुनर्निर्देशन के साथ इस्तेमाल नहीं किया जा सकता है।
ओरसिरिस डे जोंग

5

सच्ची स्क्रिप्टिंग के बिना, आप थोड़ी श्रृंखला बना सकते हैं:

touch /tmp/foo.log; chmod 0644 /tmp/foo.log; foo >> /tmp/foo.log

प्रभावी रूप से स्लोकी के उत्तर के समान , लेकिन एक-लाइनर में संघनित।

केवल एक और चीज जिसके बारे में मैं सोच सकता हूं वह है उमस के साथ छेड़छाड़। सबसे अच्छा ऐसा करने के लिए सबसे अच्छा है ताकि यह वर्तमान वातावरण को प्रदूषित न करे:

(umask 0033 && foo >> /tmp/foo.log)

हालांकि, इसके साथ दो मुद्दे।

  1. उमाक creat()syscall में निर्दिष्ट स्तर से ऊपर की अनुमतियाँ नहीं बढ़ा सकता है (0666 बश का उपयोग करता है)।
  2. यह मौजूदा फ़ाइल पर अनुमतियों को नहीं बदलेगा (क्योंकि umaskकेवल फ़ाइल निर्माण पर लागू होता है )।

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

हम्म ... फिर भी फ़ाइल को खोलने से एक अनपेक्षित प्रक्रिया की अनुमति देता है और बाद में इसकी सामग्री को पढ़ता है।
फुआरमुरमेल

(1) एक दिलचस्प, उपयोगी उपयोग खोजने पर बधाई cat। (हालांकि यह बेकार उपयोग के मानक पैटर्न का पालन नहीं करता है  cat।) (2) मुझे लगता है कि आप कहने का मतलब यह है कि फ़ाइलों को बनाते समय 0666 को मोडने के लिए बैश  करें, और इसलिए मैंने ऐसा कहने के लिए आपके उत्तर को संपादित किया। (देखें यह ,  यह   ... (जारी)
स्कॉट

(Cont'd)… और  यह ।) और प्रश्न में विशेष रूप से मोड ०६४४ का उल्लेख है। इसलिए umask२२, २३ या ३२ का मान इस संदर्भ में भी काम करेगा, (आपको अग्रणी शून्य (एस) का उपयोग करने की आवश्यकता नहीं है; जब; मोड और  umaskमूल्यों को संख्यात्मक रूप से निर्दिष्ट किया जाता है, उन्हें हमेशा अष्टक के रूप में व्याख्या की जाती है)।  22 अधिक सामान्यतः, पारंपरिक रूप से उपयोग किया जाता है।
स्कॉट

@Fermermmel: तो क्या? यह प्रश्न स्पष्ट रूप से मोड 644 के लिए कहता है। हमें यह मानना ​​होगा कि ओपी जानता है कि 644 का अर्थ है दुनिया में पढ़ने योग्य और अपनी जानकारी को सार्वजनिक करने का इरादा।
स्कॉट

1

जब पुनर्निर्देशन गलत अनुमतियाँ सेट करता है, जैसे:

$ rm capture.*
$ perl -e 'print STDERR "$$ STDERR\n"; print STDOUT "$$ STDOUT\n"' \
                            >> capture.STDOUT 2>> capture.STDERR
$ perl -e 'print STDERR "$$ STDERR\n"; print STDOUT "$$ STDOUT\n"' \
                            >> capture.STDOUT 2>> capture.STDERR
$ ls -l capture.*
-rw-rw-rw- 1 jcookinf jcookinf 22 Jun 12 10:38 capture.STDERR
-rw-rw-rw- 1 jcookinf jcookinf 22 Jun 12 10:38 capture.STDOUT
$ cat capture.*
215 STDERR
216 STDERR
215 STDOUT
216 STDOUT

मेरा मानना ​​है कि आप xynomorf जैसे कुछ का उपयोग कर सकते हैं, और bash प्रक्रिया प्रतिस्थापन का उपयोग करने के लिए मामूली संशोधन के साथ Orsiris de Jong से stderr चिंता को संबोधित कर सकते हैं ।

$ rm capture.*
$ perl -e 'print STDERR "$$ STDERR text\n"; print STDOUT "$$ STDOUT text\n"' \
            > >(umask 0033; cat >> capture.STDOUT) 2> >(umask 0033; cat >> capture.STDERR)
$ perl -e 'print STDERR "$$ STDERR text\n"; print STDOUT "$$ STDOUT text\n"' \
            > >(umask 0033; cat >> capture.STDOUT) 2> >(umask 0033; cat >> capture.STDERR)
$ ls -l capture.*
-rw-r--r-- 1 jcookinf jcookinf 32 Jun 12 10:43 capture.STDERR
-rw-r--r-- 1 jcookinf jcookinf 32 Jun 12 10:43 capture.STDOUT
$ cat capture.*
233 STDERR text
238 STDERR text
233 STDOUT text
238 STDOUT text

स्वाभाविक रूप से, सामग्री umask 0077प्राप्त करने के लिए मोड का उपयोग करें 600 और किसी अन्य उपयोगकर्ता को प्रतिबंधित करें।


0

यदि आप किसी स्क्रिप्ट को पुनर्निर्देशित करना चाहते हैं, तो इसके विपरीत umask, प्रक्रिया प्रतिस्थापन के साथ और installआप निष्पादन बिट भी सेट कर सकते हैं:

install -m 755 <(echo commands go here) newscript

<()आउटपुट को एक अस्थायी फ़ाइल में रखता है, प्रक्रिया-प्रतिस्थापन देखें

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