sudo गूंज "कुछ" >> / etc / विशेषाधिकार प्राप्त काम नहीं करता है


585

यह एक बहुत ही सरल प्रश्न है, कम से कम ऐसा लगता है जैसे यह होना चाहिए, लिनक्स में sudo अनुमतियों के बारे में।

वहाँ बार का एक बहुत जब मैं सिर्फ लिए कुछ संलग्न करना चाहते हैं /etc/hostsया इसी तरह की फाइल लेकिन अंत दोनों क्योंकि में सक्षम नहीं होने >और >>, की अनुमति नहीं है यहां तक कि जड़ के साथ।

क्या बिना जड़ के suया इस काम को करने के लिए कोई है sudo su?

जवाबों:


854

का प्रयोग करें tee --appendया tee -a

echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list

उद्धरण के अंदर उद्धरण से बचने के लिए सुनिश्चित करें।

कंसोल पर वापस डेटा प्रिंट करने से बचने के लिए आउटपुट को / dev / null में रीडायरेक्ट करें।

echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list > /dev/null

( -a/ --append) ध्वज के बारे में याद रखें ! बस की teeतरह काम करता है >और आपकी फ़ाइल को अधिलेखित कर देगा। tee -aकाम करता है >>और फ़ाइल के अंत में लिखेंगे।


3
मैं बिल्कुल इसे पसंद करता हूं। यह सिर्फ सबसे सरल है (और इसने मुझे टी के बारे में बताया, जो अन्य स्थितियों में भी काम आता है)।
जोआचिम सॉर

5
मैं सहमत हूँ। लगता है कि एक नया शट शुरू करने से भी, विशेष रूप से पर्यावरण के साथ चीजों को करने के लिए संभावित रूप से आदि
सैम ब्राइटमैन

39
एक महत्वपूर्ण बात ध्यान दें: कभी-कभी भूल जाओ! ज़रा सोचिए कि क्या करना echo 'tmpfs /tmp tmpfs defaults 0 0' | sudo tee /etc/fstabहोगा
mic_e

21
ओएस एक्स के तहत, tee -aइसके बजाय होना चाहिए tee --append
Knite

26
उन लोगों के लिए जो यह नहीं समझते हैं कि @mic_e ने क्या कहा: ( ) ध्वज के बिना -aकमांड पूरी फाइल को अंत में जोड़ने के बजाय दिए गए स्ट्रिंग के साथ अधिलेखित कर देगा--append
तोमटेली

313

समस्या यह है कि शेल आउटपुट पुनर्निर्देशन करता है, न कि sudo या इको, इसलिए यह आपके नियमित उपयोगकर्ता के रूप में किया जा रहा है।

निम्नलिखित कोड स्निपेट आज़माएं:

sudo sh -c "echo 'something' >> /etc/privilegedfile"

"सूडो अनुमति सीमाएं" क्या हैं? यह केवल शेल है जो स्पष्ट कारणों के लिए एक कमांड की तुलना में अधिक पूर्वता के साथ पुनर्निर्देशन ऑपरेटर को पार्स करता है
विन्को वेर्सालोविक

1
आपके आधार पर sh, प्रतिध्वनि \tएकल दृश्यों के अंदर भागने के दृश्यों की व्याख्या कर सकती है । आप printf %s 'something'इसके बजाय उपयोग कर सकते हैं ।

टी का उपयोग करना अधिक लोकप्रिय है और नए डिस्ट्रोस के लिए अधिक संगत है।
एडुआर्डो बी।

1
यह एकमात्र ऐसा है जो SSH कमांड के रूप में काम करता है, जिसे दूरस्थ नोड पर निष्पादित किया जा सकता है।
डंकन लॉक

मैं यहां अन्य पदों से सहमत हूं। यह एक शेल और केवल शेल का उपयोग करता है इसलिए टी जैसे अन्य प्रोग्राम की यहां आवश्यकता नहीं है। हाँ, मुझे पता है कि टी पहले से ही स्थापित है, लेकिन शायद न जाने किन माइक्रो डिस्ट्रो के आधार पर आप नंगे हड्डियों की अल्पाइन की तरह उपयोग कर रहे हैं। मुझे पसंद है कि आपके पास एक शेल विकल्प भी है: sudo /bin/bash -c "echo 'fs.inotify.max_user_watches = 524288' > /etc/sysctl.d/60-golang-inotify.conf"उदाहरण के लिए।
लिगेमर

35

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

इस तरह से कुछ का उपयोग करें, शायद:

sudo sh -c "echo 'something' >> /etc/privilegedFile"

@GordonSun ऐसा इसलिए है क्योंकि sudo(सुरक्षा कारणों से) पर्यावरण को उपप्रकार के रूप में प्रचारित नहीं करता है। आप sudo -Eइस प्रतिबंध को बायपास करने के लिए उपयोग कर सकते हैं ।
१।

1
@GordonSun हाँ यह होगा, मुझे समझ में नहीं आता कि आप इस बयान को क्यों दोहरा रहे हैं! यदि आप करते हैं sudo sh -c "echo 'something' >> $FILENAME", तो दोहरे उद्धरण चिह्नों के साथ, यह काम करेगा - चर का प्रतिस्थापन बाहरी शेल द्वारा किया जाता है, न कि सुडोल शेल से।
नादव हर’एल


13

करते हुए

sudo sh -c "echo >> somefile"

कार्य करना चाहिए। समस्या यह है कि> और >> आपके शेल द्वारा नियंत्रित किए जाते हैं, "sudoed" कमांड के द्वारा नहीं, इसलिए अनुमतियाँ आपकी हैं, न कि आप जिस उपयोगकर्ता में "sudoing" कर रहे हैं।


9

मैं नोट करूंगा, जिज्ञासु के लिए, कि आप एक हेरेडोक (बड़े ब्लॉक के लिए) भी उद्धृत कर सकते हैं:

sudo bash -c "cat <<EOIPFW >> /etc/ipfw.conf
<?xml version=\"1.0\" encoding=\"UTF-8\"?>

<plist version=\"1.0\">
  <dict>
    <key>Label</key>
    <string>com.company.ipfw</string>
    <key>Program</key>
    <string>/sbin/ipfw</string>
    <key>ProgramArguments</key>
    <array>
      <string>/sbin/ipfw</string>
      <string>-q</string>
      <string>/etc/ipfw.conf</string>
    </array>
    <key>RunAtLoad</key>
    <true></true>
  </dict>
</plist>
EOIPFW"

1
यह अच्छा काम करता है एक \ के साथ भाग करना पड़ सकता है एम्बेडेड उद्धरण को छोड़कर,
एन जोन्स

सही @NJones! मैं अपना उत्तर संपादित करूंगा। (ध्यान दें, हालांकि, ऐसा करने से आंतरिक "नहीं होता है, लेकिन यह कमांड को विफल करने का कारण नहीं बनता है।)
एमएसनफोर्ड


4

यू के उत्तर का उपयोग करते हुए , इसे अपने में डालें ~/.bashrc:

sudoe() {
    [[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1
    echo "$1" | sudo tee --append "$2" > /dev/null
}

अब तुम दौड़ सकते हो sudoe 'deb blah # blah' /etc/apt/sources.list


संपादित करें:

एक अधिक पूर्ण संस्करण जो आपको किसी फ़ाइल से इनपुट या रीडायरेक्ट करने की अनुमति देता है और इसमें शामिल होने के लिए -aस्विच शामिल है (जो डिफ़ॉल्ट रूप से चालू है):

sudoe() {
  if ([[ "$1" == "-a" ]] || [[ "$1" == "--no-append" ]]); then
    shift &>/dev/null || local failed=1
  else
    local append="--append"
  fi

  while [[ $failed -ne 1 ]]; do
    if [[ -t 0 ]]; then
      text="$1"; shift &>/dev/null || break
    else
      text="$(cat <&0)"
    fi

    [[ -z "$1" ]] && break
    echo "$text" | sudo tee $append "$1" >/dev/null; return $?
  done

  echo "Usage: $0 [-a|--no-append] [text] <file>"; return 1
}

2

आप पैकेज spongeसे भी उपयोग कर सकते हैं moreutilsऔर आउटपुट को रीडायरेक्ट करने की आवश्यकता नहीं है (यानी, teeछिपाने के लिए शोर नहीं ):

echo 'Add this line' | sudo sponge -a privfile

0

Sed -i का उपयोग करके साथ में $ a , आप अंतिम पंक्ति के बाद, चर और विशेष वर्ण दोनों वाले पाठ को जोड़ सकते हैं।

उदाहरण के लिए, $ NEW_HOST को $ NEW_IP के साथ / etc / मेजबानों में जोड़ना:

sudo sed -i "\$ a $NEW_IP\t\t$NEW_HOST.domain.local\t$NEW_HOST" /etc/hosts

sed विकल्प समझाया:

  • -में जगह के लिए
  • $ अंतिम पंक्ति के लिए
  • एक परिशिष्ट के लिए


0

कैसे के बारे में:
गूंज पाठ | sudo dd स्टेटस = कोई नहीं = विशेषाधिकारी
जिसे मैं बदलना / खरीदना / खरीदता / करना चाहता हूं / net / ipv4 / tcp_rmem।
मैंने किया:
sudo dd स्टेटस = = / proc / sys / net / ipv4 / tcp_rmem <<< "4096 131072 1024000" में
से कोई भी एकल पंक्ति दस्तावेज़ के साथ समाप्त नहीं होता है


1
कृपया सहायता केंद्र में संपादन सहायता के माध्यम से पढ़ने के लिए कुछ समय दें । स्टैक ओवरफ्लो पर प्रारूपण अन्य साइटों की तुलना में अलग है।
22

-1

यह मेरे लिए काम किया: मूल आदेश

echo "export CATALINA_HOME="/opt/tomcat9"" >> /etc/environment

कार्य कमान

echo "export CATALINA_HOME="/opt/tomcat9"" |sudo tee /etc/environment

1
होना चाहिए tee -a। बस teeफ़ाइल को अधिलेखित कर देगा!
कोडफोरर

-6

क्या आप फ़ाइल के स्वामित्व को बदल सकते हैं, फिर cat >>अपेंडेड उपयोग करने के बाद इसे वापस बदल सकते हैं ?

sudo chown youruser /etc/hosts  
sudo cat /downloaded/hostsadditions >> /etc/hosts  
sudo chown root /etc/hosts  

आपके लिए यह काम कुछ ऐसा है?


4
चाउन एक विनाशकारी आदेश का उपयोग करने के लिए है। यदि एक विन्यास प्रबंधक ने अद्यतन / आदि / होस्ट करने के लिए उपयोग किया है, तो अचानक / आदि / मेजबान उपयोगकर्ता को कॉन्फ़िगर करने के लिए है और रूट नहीं है। जो संभावित रूप से अन्य प्रक्रियाओं तक पहुंच / / होस्ट करने के लिए उपयोग नहीं करता है। सुडो का पूरा बिंदु कुछ रूट में लॉग इन होने से बचने के लिए है और sudoers के माध्यम से और अधिक प्रतिबंधों को भी ढेर किया जा सकता है।
डेविड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.