फ़ाइल को sudo के रूप में कैसे जोड़ा जाए?


271

मैं करना चाहता हूँ:

echo "something" >> /etc/config_file

लेकिन, चूंकि केवल रूट उपयोगकर्ता ने इस फ़ाइल की अनुमति लिखी है, इसलिए मैं ऐसा नहीं कर सकता। लेकिन निम्नलिखित भी काम नहीं करता है।

sudo echo "something" >> /etc/config_file

क्या उस स्थिति में किसी फ़ाइल को अपग्रेड करने का कोई तरीका है, बिना पहले इसे sudo'डी एडिटर' के साथ खोलने और फिर नई सामग्री को हाथ से लगाने के लिए ?


मैं उबंटू 9.04 का उपयोग कर रहा हूं और मुझे अब तक की आवश्यकता वाली प्रत्येक कमांड के लिए सूडो का उपयोग करने में सक्षम हूं। एक उप-शेल का काम करना।
मैट नॉरिस

जवाबों:


390

के साथ प्रयोग tee -a(या tee --append)sudo

tee - read from standard input and write to standard output and files
[...]
   -a, --append
      append to the given FILEs, do not overwrite
[...]

तो आपकी आज्ञा बन जाती है

echo "something" | sudo tee -a /etc/config_file

teeप्रशासनिक अनुमति के साथ बैश को निष्पादित करने के फायदे हैं

  • आप प्रशासनिक अनुमतियों के साथ बैश को निष्पादित नहीं करते हैं
  • केवल 'राइट टू फाइल' भाग उन्नत अनुमतियों के साथ चलता है
  • एक जटिल कमांड का उद्धरण करना बहुत आसान है

2
OS X टी पर केवल एक-ए झंडा लगता है।
लारी

डेबियन 8 teeमें -aएपेंड फ्लैग है।
मिट्टी

9
echo "output" | sudo tee -a file > /dev/nullयदि आप कंसोल आउटपुट को छोड़ना चाहते हैं तो उपयोग करें ।
मोशे बिक्सेनस्पैन

डब्ल्यूएसएल के लिए भी अच्छा काम करता है।
kayleeFrye_onDeck

50

पुनर्निर्देशन को वर्तमान शेल में निष्पादित किया जाता है। उन्नत विशेषाधिकारों के साथ पुनर्निर्देशन करने के लिए, आपको स्वयं को उन्नत विशेषाधिकारों के साथ खोलना होगा:

sudo bash -c "somecommand >> somefile"

26

सुडो स्पान को एक उप-खोल है:

sudo sh -c "echo 'JAVA_HOME=/usr/lib/jvm/java-6-sun' >> /etc/profile"

इस उदाहरण में, सूडो तर्कों के रूप में बाकी लोगों के साथ "श" चलाता है।

(यह sudo मैन पेज में एक उदाहरण के रूप में दिखाया गया है)


8
कारण यह है कि यह आपका शेल है (आप के रूप में चल रहा है) जो पुनर्निर्देशन करता है, सूडो नहीं। चूँकि आपके पास फ़ाइल लिखने की अनुमति नहीं है, इसलिए आपको अनुमति अस्वीकृत त्रुटि मिलती है। यह उत्तर क्या करता है एक नया शेल शुरू करने के लिए जो रूट के रूप में चल रहा है, और इसलिए फ़ाइल में लिखने में सक्षम है।
रैंडी ऑरिसन

यह सही उत्तर नहीं है। यह एक सही उत्तर है। उस उत्तर में दिए गए तर्क के लिए अकीरा एक बेहतर है।
टोगम


4

मेरी राय में, इस मामले में सबसे अच्छा है dd:

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END

3

यहां सूडो और पुनर्निर्देशन में समस्या हो सकती है। लाइन जोड़ने के बजाय अपनी पसंद के टेक्स्टेडिटर का उपयोग करें।

sudo nano /etc/profile

या, आप इसके बजाय सु की कोशिश कर सकते हैं

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit

दुर्भाग्य से, यह एक ही परिणाम का उत्पादन किया।
मैट नॉरिस

1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'कार्य करना चाहिए। चूँकि कुछ भी नहीं है कि खोल गलती से प्रतिध्वनि के लिए arg में विस्तार कर सकता है, समग्र कमांड को एकल-उद्धरण कर सकता है।
क्विकोट

यह बढ़िया है। अब इसे एक स्क्रिप्ट के हिस्से के रूप में करें।
एर्नी डनबार

0

यह काम नहीं करेगा जो आप >>sudo के आउटपुट को पुनर्निर्देशित (उपयोग ) कर रहे हैं । क्या आप वास्तव में करना चाहते हैं के उत्पादन को पुनर्निर्देशित किया है echo। मेरा सुझाव है कि आप बस अपने पसंदीदा संपादक का उपयोग करें और मैन्युअल रूप से उस पंक्ति को जोड़ें /etc/profile। इसका अतिरिक्त लाभ है कि आप जांच सकते हैं कि क्या /etc/profileपहले से ही सेट है JAVA_HOME


0

पूर्व मार्ग का उपयोग करें :

sudo ex +'$put =\"FOO\"' -cwq /etc/profile

और FOOसंलग्न करने के लिए अपने चर के साथ बदलें ।

कुछ प्रणालियों में (जैसे कि OS X), /etc/profileफ़ाइल में 444 अनुमतियाँ हैं, इसलिए यदि आपको अभी भी अनुमति से वंचित किया जा रहा है , तो पहले जाँच करें और अनुमति को सही करें:

sudo chmod 644 /etc/profile

फिर कोशिश करें।

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