कमांड को कैसे चलाना है जिसमें सुडो के साथ पुनर्निर्देशन या पाइपिंग शामिल है?


60

मैं यह मानने की कोशिश कर रहा हूं कि जो मैं मानता हूं वह रूट खाते के बजाय सुडो का उपयोग करने का सबसे अच्छा अभ्यास है।

मैं एक साधारण कॉनैट फाइल ऑपरेशन चला रहा हूं जैसे:

sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

यह ">>" के दाईं ओर विफल रहता है क्योंकि यह सामान्य उपयोगकर्ता के रूप में चल रहा है। अतिरिक्त sudos जोड़ना भी विफल हो जाता है (sudo कमांड पर पाइप करने के बाद से और फ़ाइल में नहीं) अपेक्षित व्यवहार।

उदाहरण सिर्फ इतना है, लेकिन इसे रूट खाते के तहत सत्यापित और परीक्षण किया गया है।

जवाबों:


75

आप मूल के रूप में एक नया शेल ला सकते हैं:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

आप फ़ाइल में लिखने के लिए एक प्रक्रिया को भी बढ़ा सकते हैं:

sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF

8
सामान्य तौर पर दूसरा विकल्प अधिक सुरक्षित होता है क्योंकि केवल teeकमांड रूट के रूप में चलती है, न कि मुख्य कमांड जो जटिल हो सकती है और दुर्व्यवहार की संभावना हो सकती है। (नहीं का मामला echo)
पाबौक

19

एक अन्य विकल्प, समान रूप से सुरक्षित, उपयोग करने के लिए है sudoकी -iजड़ के रूप में प्रवेश करने के लिए स्विच:

$ sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

यह अभी भी सबसे अच्छा अभ्यास नियमों का पालन करता है क्योंकि रूट खाता वास्तव में इस तरह से सक्षम नहीं है, लेकिन आपको चीजों को रूट के रूप में सुरक्षित रूप से करने देता है। से man sudo:

The -i (simulate initial login) option runs the shell
    specified by the password database entry of the target user
    as a login shell.  This means that login-specific resource
    files such as .profile or .login will be read by the shell.
    If a command is specified, it is passed to the shell for
    execution via the shell's -c option.  If no command is
    specified, an interactive shell is executed. 

एक अन्य विकल्पsudo bash
स्टारब्रेन्रोबलाब्ज

11

यदि आप एकल उद्धरणों के बिना अपना आदेश व्यक्त करते हैं, तो आप इसे एकल उद्धरणों के अंदर रख सकते हैं और एक मध्यवर्ती शेल के माध्यम से निष्पादित कर सकते हैं।

इसे रूट के रूप में निष्पादित करने के लिए:

echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

कमांड को एक अलग तरीके से लिखें जो उपयोग नहीं करता है ':

echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock

फिर आह्वान करें sudo sh -c …:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

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

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

और अधिक जटिल फ़ाइल संशोधनों के लिए, आप कॉल कर सकते हैं sudo sed, sudo ed, sudo perl, ...

वैकल्पिक रूप से, एक सभ्य संपादक का उपयोग करें और इसे sudo कहते हैं। Emacs में, खोलें /sudo:/etc/conf.d/hwclock। विम में, :w !sudo tee %खोली गई फ़ाइल को रूट के रूप में लिखने के लिए कॉल करें , या sudo.vim प्लगइन का उपयोग करें । या फिर सूडो एंड से जाएं और कॉल करें sudoedit /etc/conf.d/hwclock

या आप अंधेरे पक्ष में दे सकते हैं और एक खोल को जड़ के रूप में चला सकते हैं।

$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

5

फ़ाइल पर अनुमतियों के कारण आदेश विफल हो जाता है। पुनर्निर्देशन sudoआदेश लागू होने से पहले भी होता है।

आपको यह सुनिश्चित करना होगा कि यह रूट है जो वास्तव में लिखने के लिए फ़ाइल को खोलता है।

ऐसा करने का सबसे सरल तरीका:

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

echoसाधारण उपयोगकर्ता आप के रूप में चलाया जा सकता है, क्योंकि यह सिर्फ एक पाठ स्ट्रिंग पैदा करता है। teeउपयोगिता हालांकि रूट के रूप में चलाने के लिए होगा, और tee -aडेटा जोड़ देंगे। हम आउटपुट को पुनर्निर्देशित करते हैं , /dev/nullक्योंकि teeडिफ़ॉल्ट रूप से, संकेतित फ़ाइलों को लिखने के अलावा अपने इनपुट डेटा को अपने मानक आउटपुट पर डुप्लिकेट करेगा।

bash"यहाँ-तार" को समझने वाले किसी भी शेल के साथ :

sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'

यह ऊपर के प्रभाव में समान है। केवल हम स्ट्रिंग का उत्पादन करने का तरीका बदल गया है।


यह करने का एक और, थोड़ा गोल रास्ता:

sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'

यहां, पुनर्निर्देशन sh -cमूल रूप से चल रहे एक बच्चे के खोल के भीतर होता है ।


4

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 कमांड को आगे बढ़ाता है।

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