2012-12-02 13 views
6

के लिए बैश प्रक्रिया प्रतिस्थापन का उपयोग करना मैं एक सूडो कमांड के लिए बैश प्रक्रिया प्रतिस्थापन का उपयोग करना चाहता हूं।एक सूडो कमांड

उदाहरण के लिए, यहाँ एक गैर sudo आदेश है कि मेरे लिए काम करता है:

$ cat <(echo "installed.txt") 
installed.txt 

और यहाँ वह काम नहीं करता आदेश की एक sudo संस्करण है:

$ sudo cat <(echo "installed.txt") 
cat: /dev/fd/63: Bad file descriptor 

sudo आदमी पेज पढ़ना , ऐसा लगता है कि सूडो रूट के रूप में कमांड चलाने से पहले stdin/stdout/stderr फ़ाइल वर्णनकर्ताओं के अलावा सभी को बंद कर देता है। इससे मुझे लगता है कि सशो कमांड चलाने से पहले बैश वर्णनकर्ता (और प्रक्रिया प्रतिस्थापन कर रहा है) बना रहा है।

मैंने रूट के खोल को बाश में बदल दिया (sh डिफ़ॉल्ट के बजाय)। मैंने परीक्षण किया है कि रूट के रूप में लॉग इन करते समय आदेश ठीक काम करता है। यह केवल एक सूडो कमांड के माध्यम से काम नहीं करता है।

मैं जो करने की कोशिश कर रहा हूं उसे हासिल करने के लिए उपयुक्त तकनीक क्या है? Eval, उद्धरण, सूडो झंडा, sudoers फ़ाइल mod, अन्य?

उत्तर

6

अपने खोल में ऐसा करने का प्रयास करें:

$ sudo bash -c 'cat <(echo "installed.txt for UID=$UID")' 
installed.txt for UID=0 
0

सबसे अच्छा तरीका शायद सब कुछ एक स्क्रिप्ट में रखना है, और उस स्क्रिप्ट को sudo के साथ चलाएं।

+0

सबकुछ एक-लाइनर है; मैं ऐसा करने की ज़रूरत से बचना चाहता हूं। –

+1

@ClaytonStanley फिर अन्य (बहुत अच्छे) उत्तरों में दिए गए समाधानों का उपयोग करें ... –

3
sudo bash -c 'cat <(echo "installed.txt")' 
+1

यह भी स्वीकार्य उत्तर है, लेकिन यह इसकी सबसे पुरानी पोस्टिंग नहीं थी। –

+0

हम दोनों एक ही समय में frantically टाइपिंग थे! आप उन्हें सब जीत नहीं सकते हैं। बिंदु पर और, मैं उन्हें जीत नहीं सकता! – emrys57

+0

एक लाइन लिखने के लिए 3 मिनट? हू! =) –

4

व्यवहार प्रश्न में वर्णित sudo के डिजाइन की वजह से है।

$ sudo cat <(echo "installed.txt") 
cat: /dev/fd/63: Bad file descriptor 

त्रुटि तब होती है क्योंकि sudo एक डिफ़ॉल्ट व्यवहार जो मानक इनपुट, आउटपुट और त्रुटि के अलावा फ़ाइल वर्णनकर्ता बंद कर देता है है। जैसा कि मैन पेज पर वर्णित है:

डिफ़ॉल्ट रूप से, कमांड निष्पादित करते समय मानक इनपुट, मानक आउटपुट और मानक त्रुटि के अलावा सभी खुले फ़ाइल डिस्क्रिप्टर बंद कर देंगे।

यह व्यवहार -C (या --close-from) विकल्प के लिए एक फ़ाइल वर्णनकर्ता संख्या जो नीचे फ़ाइलों बंद नहीं किया जाना चाहिए निर्दिष्ट करने के लिए साथ अधिरोहित जा सकता। हालांकि, इस विकल्प के उपयोग किसी व्यवस्थापक द्वारा अनुमति दी जाना चाहिए: निम्नलिखित जरूरतों /etc/sudoers

Defaults closefrom_override 
उस जगह में साथ

में जोड़े जाने की, आदेश काम करेंगे अगर -C प्रयोग किया जाता है:

$ sudo -C64 cat <(echo "installed.txt") 
installed.txt 

(यहां 64 नंबर दिया गया था क्योंकि यह त्रुटि संदेश में 63 से अधिक था)।

संबंधित मुद्दे