कमांडो के लिए sudo su का उपयोग करना?


15

मैं कल रात अपने कमांड लाइन कौशल को विकसित करने पर काम कर रहा था और एक ऐसे मुद्दे पर भाग गया, जब मैंने sudo का उपयोग किया, तो मुझे एक त्रुटि संदेश मिला जिसमें कहा गया था कि 'अनुमति अस्वीकृत'। हालाँकि जब मैंने 'सुडो सु' का इस्तेमाल किया और रूट हो गया तो कमांड ने काम किया।

पहले उदाहरण में सूडो काम क्यों नहीं करते थे?

ये था:

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D

LAMP सर्वर सेट करने पर अनुभाग में लिनक्स बाइबिल 2010 संस्करण से।


यदि आप एक उदाहरण नहीं देते हैं तो समस्या को हल करना कठिन है।
लासपुलसेन

1
पर विचार करें sudo -sअधिक sudo su
जेरेमी एल

जवाबों:


18

<,> और >> कमांड के लिए इनपुट / आउटपुट पुनर्निर्देशन के लिए उपयोग किया जाता है - जो कि शेल द्वारा प्रदान की गई विशेषता है (उदाहरण के लिए, bash)। इसलिए यदि आप एक कमांड टाइप करते हैं sudo cat > /var/www/info.phpतो शेल जो इसे प्राप्त करता है इनपुट के रूप में फाइल को खोलने का प्रयास करता है /var/www/info.phpऔर sudoकमांड के मानक आउटपुट के रूप में उस फाइल को प्रदान करता है । sudoआदेश भी पता इसके उत्पादन एक कंसोल जा रहा है या एक फ़ाइल के लिए पुनः निर्देशित है, क्योंकि यह खोल द्वारा ध्यान रखा जाता है कि आह्वान यह है कि क्या नहीं है।

यदि आपने जिस शेल में अपनी कमांड टाइप की है, वह आपका लॉगिन शेल है या आपकी यूजर आईडी के साथ टर्मिनल में चल रहा एक अन्य शेल है, तो इसमें आपकी यूजर आईडी के समान विशेषाधिकार हैं - रूट के नहीं।

तो आपके मामले में, जबकि बिल्ली कमांड को रूट के रूप में निष्पादित किया जाता है, इसके आउटपुट की प्रतिलिपि /var/www/info.phpशेल को सामान्य उपयोगकर्ता के रूप में चलाने का प्रयास किया जाता है, जो कि उम्मीद के मुताबिक विफल रहता है।

ऐसी स्थितियों के लिए वर्कअराउंड teeकमांड का उपयोग करना है :

sudo tee /var/www/info.php

पैरामीटर के रूप में निर्दिष्ट फ़ाइल में ^ D तक कंसोल में दर्ज किए गए सभी पाठ को डालने का इरादा प्रभाव होगा।

एक शायद अंडरस्टैंडिंग साइड-इफ़ेक्ट यह है कि teeआउटपुट को स्टैडआउट में भी प्रतिध्वनित किया जाएगा, इसलिए जब आप प्रत्येक लाइन टाइप करते हैं और एंटर दबाते हैं तो teeउसकी एक कॉपी वापस आ जाएगी। इससे बचने के लिए आप निम्न प्रकार का उपयोग कर सकते हैं।

sudo tee /var/www/info.php > /dev/null

इसके बारे में विवरण एक टर्मिनल पर teeदिया जा सकता है info tee


2

sudo उन कमांड्स के लिए काम नहीं करता है, जिन्हें फाइल लिखने के लिए परमिशन की जरूरत होती है, जैसे:

sudo echo "vm.swappines = 100" >> /etc/sysctl.conf

यह सूडो मैन-पेज में व्याख्या करता है।


4
यह उल्लेख करते हुए कि आप एक रूट प्रॉम्प्ट प्राप्त करने के लिए "sudo -i" या "sudo -s" कर सकते हैं, इस उत्तर को और बेहतर बना देगा!
जोर्ज कास्त्रो

उदाहरण कमांड में कोई पाइप नहीं है; एक पुनर्निर्देशन है। इसके अलावा, "कभी-कभी काम नहीं करता है" द्वारा भड़कीले व्यवहार को व्यक्त करता है sudo। जैसा कि कौशिक के उत्तर में उल्लेख किया गया है, व्यवहार यूनिक्स अनुमति मॉडल के लिए काफी अनुमानित, सुसंगत और "सही" है।
msw

2

समस्या यह है कि "> foo.txt" भाग सूडो कमांड चलाए जाने से बहुत पहले आपके कमांड दुभाषिया (शेल) द्वारा व्याख्या और निष्पादित किया जाता है। Sudo कमांड का कोई विचार नहीं है कि आप इसके आउटपुट को किसी फ़ाइल में रीडायरेक्ट करना चाहते हैं।

आपके कमांड दुभाषिया में रूट अथॉरिटी नहीं है (लेकिन सूडो कमांड बाद में होगा) इसलिए यह आउटपुट को foo.txt पर पुनर्निर्देशित नहीं कर सकता है।


1

इसे हल करने के लिए एक और तरीका है सूडो के साथ एक सबशेल शुरू करना और उस सबस्क्रिप्शन में उस कमांड को निष्पादित करना:

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

यहां, "सुडो" के कमांड को बैश किया गया है, और इसमें निष्पादित किसी भी चीज की रूट अनुमतियां हैं।

$ 2 सी, * -पाइक

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