कैसे बैश में पुनर्निर्देशन के साथ sudo का उपयोग करते समय "अनुमति से इनकार" को हल करने के लिए?


137

फ़ाइलों का संपादन करने के लिए sudo का उपयोग करते समय, मैं नियमित रूप से 'अनुमति अस्वीकृत' प्राप्त करता हूं।

उदाहरण के लिए, मेरा माउस चिड़चिड़ा और सुस्त है, इसलिए मैं मतदान अक्षम करना चाहता हूं:

sudo echo "options drm_kms_helper poll=N">/etc/modprobe.d/local.conf

मुझे एक पासवर्ड के लिए संकेत दिया गया है, और फिर प्राप्त करें:

bash: /etc/modprobe.d/local.conf: Permission denied

इसलिए मैंने उपयोग करके मतदान को निष्क्रिय करने के लिए एक अस्थायी परिवर्तन करने की कोशिश की:

sudo echo N> /sys/module/drm_kms_helper/parameters/poll

फिर भी सिस्टम ने फिर से जवाब दिया:

bash: /sys/module/drm_kms_helper/parameters/poll: Permission denied

कोई विचार?

जवाबों:


156

आउटपुट पुनर्निर्देशन ( >ऑपरेटर के माध्यम से ) शेल द्वारा किया जाता है, इको द्वारा नहीं । आपको रूट के रूप में लॉगिन करना होगा

sudo -i

तब आप पुनर्निर्देशन का उपयोग कर सकते हैं

echo N> /sys/module/drm_kms_helper/parameters/poll

अन्यथा आप sudo के साथ bash string चला सकते हैं

sudo bash -c "echo N> /sys/module/drm_kms_helper/parameters/poll"

1
आप sudo के साथ इको नहीं चला सकते हैं? परिणाम मुझे क्या मिला:saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi
saji89

आप फ़ाइल पर लिख सकते हैं, "कुछ"> somehre। यह पाइप का उपयोग कर रहा है .. यही समस्या है।
शांतनु

4
ठीक है, यदि यह मामला है, तो कृपया अपने उत्तर को अपडेट करें कि यह प्रतिध्वनित करना कि केवल उस मामले में समस्या चल रही है।
साजी 89

echoजब तक आप ऐसा कुछ नहीं करते, आप बस शेल बिल्ट को सुडो के रूप में नहीं चला सकते हैं sudo bash -c 'echo …'; हालाँकि, POSIX सिस्टम आमतौर पर OS X echoजैसे बाहरी कमांड की आपूर्ति करता है /bin/echo, जिसे sudo बिना रिगरामोल के निष्पादित कर सकता है। इस प्रकार, echoआमतौर पर आप जो कमांड चलाते हैं और जो echoकमांड आप सूडो के साथ चलाते हैं, वे संभवतः दो अलग-अलग हैं, लेकिन समान कमांड।
कोजिरो

यदि ऐसा है, तो इस प्रश्न के उत्तर प्रतिध्वनित क्यों हुए? askubuntu.com/questions/840431/…
हर्ष

75

आउटपुट पुनर्निर्देशन शेल द्वारा किया जाता है जिसमें से कमांड को आमंत्रित किया गया है । तो, बिट्स में सब कुछ तोड़ना, यहाँ क्या हो रहा है *:

  • शेल चालान sudo echo "options drm_kms_helper poll=N", जो कमांड लाइन के sudoसाथ echo "options drm_kms_helper poll=N"कमांड निष्पादित करता है

  • सुडो एक पासवर्ड के लिए पूछता है, सुपरसुअर शेल खोलता है और आक्रमण करता है echo "options drm_kms_helper poll=N", जो echoइसे पास करने के लिए कमांड चलाता है"options drm_kms_helper poll=N"

  • इको, rootविशेषाधिकारों के साथ चल रहा है , स्ट्रिंग को अपने मानक आउटपुट में प्रिंट करता है।

  • echoकमांड टर्मिनेट, सुपरसुअर शेल बाहर निकलता है, sudoसमाप्त होता है

  • जिस शेल से कमांड मंगाया गया है वह आउटपुट को इकट्ठा करता है और इसे रीडायरेक्ट करने की कोशिश करता है /etc/modprobe.d/local.conf, जो केवल रूट द्वारा लिखने योग्य है। इसे "अनुमति अस्वीकृत" त्रुटि मिलती है।

इसे ठीक करने के तरीकों के लिए @ शांतनु उत्तर देखें।


(*) - जबकि उपरोक्त अनुक्रम यह समझने में मदद करता है कि कमांड विफल क्यों होता है, वास्तव में कुछ चीजें आउट-ऑफ-ऑर्डर होती हैं: मूल शेल पुनर्निर्देशन को नोटिस करता है और sudo ...कमांड को लागू करने से पहले लिखने के लिए फ़ाइल खोलने की कोशिश करता है । जब फ़ाइल खोलना विफल हो जाता है, तो शेल उस कमांड को भी लागू नहीं करता है, जिसे फ़ाइल में लिखना चाहिए था (यह इंगित करने के लिए @PanosRontogiannis के लिए धन्यवाद)।

यहाँ एक त्वरित परीक्षण है:

$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied

ऊपर परीक्षण में "रूट" शब्द युक्त whoami | tee who.txtएक फ़ाइल बनाने जा रहा था who.txt। हालाँकि, जब आउटपुट पुनर्निर्देशन कॉलिंग शेल में विफल रहता है, तो "who.txt" फ़ाइल भी अनुपलब्ध है क्योंकि कमांड को इनवॉइस नहीं किया गया था।


अधिक संभावना है कि शेल 'फोर्क्स' खुद ही है और /etc/modprobe.d/local.conf को 'sudo' निष्पादित करने का प्रयास करने से पहले खोलने का प्रयास करता है, जिसका अर्थ है कि आपके द्वारा वर्णित पहले 4 चरण वास्तव में कभी नहीं होते हैं क्योंकि फ़ाइल को खोला नहीं जा सकता है।
पैनोस रोन्टोगियनिस

1
@PanosRontogiannis: धन्यवाद, मैंने जवाब अपडेट किया है
सेर्गेई

60

शांतनु के जवाब में जोड़ना:

... या आप teeइस तरह से एक कमांड का उपयोग कर सकते हैं :

sudo tee /sys/module/drm_kms_helper/parameters/poll <<<10

या यदि इसका कमांड आउटपुट है:

echo 10 | sudo tee /sys/module/drm_kms_helper/parameters/poll

3
+1 रूट के रूप में लॉग करना मैन्युअल काम के लिए एक बुरा विचार है, और स्क्रिप्टेड कार्यों के लिए वास्तव में बुरा विचार है।
l0b0

2
इसके अलावा, sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/nullयदि आप इसे मुद्रण के लिए भी नहीं चाहते हैं stdout
फाबियान टैंप

16

एक दृष्टिकोण जो मैंने यहाँ नहीं देखा है, वह है बस पूरी कमांडलाइन को अपने शेल में निष्पादित करना। sudoमैनपेज ही इस दृष्टिकोण का एक उदाहरण देता है:

/ होम विभाजन में निर्देशिकाओं की उपयोग सूची बनाना। ध्यान दें कि यह cd और फ़ाइल पुनर्निर्देशन कार्य करने के लिए उप-शेल में कमांड चलाता है।

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

वाह धन्यवाद। एक सरल उपाय
लचीलापन

4

एक अन्य विकल्प एक अस्थायी फ़ाइल का उपयोग करना है। यह एक बैश स्क्रिप्ट में उपयोगी है।

temp=$(mktemp)
echo "Hello, world!" > $temp
sudo cp $temp /etc/wherever

3

sudo dd of=

आप चाहते हैं के रूप में संलग्न करने के लिए:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

या खरोंच से फ़ाइल को फिर से बनाने के लिए:

echo inbytes | sudo dd of=outfile

लाभ:

  • teeकोई /dev/nullपुनर्निर्देशन की तुलना में अच्छे
  • shकोई स्पष्ट उपधारा की तुलना में अच्छे (लेकिन पुनर्निर्देशन के लिए एक निहित)
  • ddकई शक्तिशाली विकल्प हैं, उदाहरण के status=progressलिए स्थानांतरण प्रगति देखने के लिए

काम करता है क्योंकि sudo कमांड को आगे बढ़ाता है।


1
यह अच्छा है। हम सोचते हैं ddकि कैसे हम अपने एक बार के महान फाइल सिस्टम को अधिलेखित कर देते हैं, और यह महसूस नहीं करते हैं कि यह सांसारिक कार्यों के लिए भी है - और यह कि रूट के रूप में अन्य कमांड भी गलत फ़ाइलों / उपकरणों पर उपयोग किए जाने पर बहुत नुकसान पहुंचाते हैं। जैसेsudo tee , यहाँsudo dd भी तार के साथ काम करेंगे , जैसे, उदाहरण के लिए sudo dd of=outfile <<<'hello world'। [संपादन के लिए धन्यवाद। नायब sh -c 'cmd', shएक उपप्रजाति है जो एक शेल है, लेकिन वास्तव में एक उपप्रकार नहीं है, इस अर्थ में कि सभी बाहरी कमांड एक के रूप में शुरू होते हैं।]
एलिया कगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.