यदि मैं एक लाइनर की शुरुआत में "sudo" टाइप करता हूं, तो क्या यह बाकी कमांड्स पर लागू होता है?


10

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

दूसरे शब्दों में, यह है:

sudo foo | foo2 | foo3

इसके बराबर:

sudo foo | sudo foo2 | sudo foo3

जवाबों:


11

अपने आप को यह समझाने के तरीके के रूप में कि sudoकेवल पहली कमांड का उपयोग करके ही इसे प्रदान किया जाता है, और पहली पाइप के चालू होने के बाद बाकी सब कुछ आपकी मूल उपयोगकर्ता आईडी के रूप में आप इसे देखने के लिए आदेशों की इस बेकार श्रृंखला का उपयोग कर सकते हैं।

उदाहरण 1

$ sudo whoami > file1 | whoami > file2 | whoami > file3

जब आप catउन फ़ाइलों को देखेंगे तो आपको निम्नलिखित उपयोगकर्ता नाम दिखाई देंगे:

$ cat file{1..3}
root
saml
saml

उदाहरण # 2

हालाँकि यदि आप एक सब-रन चलाते हैं:

$ sudo sh -c 'whoami > file4 | whoami > file5 | whoami > file6'

जब आप catइन फ़ाइलों को देखेंगे तो आपको निम्न उपयोगकर्ता नाम दिखाई देंगे:

$ cat file{4..6}
root
root
root

उदाहरण # 3

के बारे में आपकी टिप्पणी sudo foo1 | sudo foo2 ...कभी काम नहीं करेगी, क्योंकि इससे आउटपुट को sudo foo1खिलाया जाएगा sudo foo2। मेरे whoamiउदाहरणों का उपयोग करने से पता चलता है कि आदेशों की श्रृंखला कुछ नहीं करती है।

$ sudo whoami | sudo whoami | sudo whoami
root

पहले 1 भाग गया, लेकिन दूसरा और तीसरा कुछ भी नहीं करते क्योंकि वे इनपुट लेने के लिए सुसज्जित नहीं हैं। बल्कि मुझे लगता है कि आप कुछ इस तरह से लिखना चाहते हैं:

$ sudo whoami;sudo whoami;sudo whoami
root
root
root

जो इसे 3 अलग-अलग कमांड प्रॉम्प्ट पर 3 बार चलाने के बराबर है। या यह:

$ sudo whoami && sudo whoami && sudo whoami
root
root
root

लेकिन कभी भी ऐसा न करें। यह अगले भाग में है।

सुडोल कहने के लिए अस्पष्ट तरीके

ये मेरा सबसे अच्छा काम नहीं हैं, लेकिन अन्य तरीके हैं जो आपने मुझे कई कमांड का उपयोग करते हुए देखे होंगे sudo। मैं उन्हें यहाँ केवल यह सिखाने के लिए दिखाता हूँ ताकि अन्य लोग उन्हें करना ज़रूरी समझें!

रास्ता # 1

$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh

यह काम किस प्रकार करता है?

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

रास्ता # 2

$ sudo tee /proc/sys/vm/drop_caches <<<1

यह काम किस प्रकार करता है?

यह विधि teeप्रोग्राम को रूट के रूप में चलाती है और यहां एक स्ट्रिंग से इनपुट लेती है जो कमांड को sudoलागू करने से पहले चलती है tee

रास्ता # 3

# this way
$ sudo -s -- 'whoami'

# or this way
sudo -s -- sh -c 'whoami;whoami'

यह काम किस प्रकार करता है?

ये अलग दिख सकते हैं लेकिन वे वास्तव में एक ही काम कर रहे हैं। -sस्विच का उपयोग करते समय , sudoएकल कमांड चलाएगा। अगर यह बच निकलने का कोई रास्ता होता तो मैं कभी पता नहीं लगा सकता। ऐसा कुछ भी काम नहीं करेगा।

# this
$ sudo -s -- 'whoami;whoami'

# or this
$ sudo -s -- 'whoami\;whoami'

लेकिन मैन पेज को देखते हुए, -sस्विच कहता है कि यह /etc/passwdफ़ाइल के उपयोगकर्ता के प्रवेश में परिभाषित शेल के लिए एक एकल कमांड पास करेगा । तो हम दूसरे रूप में एक चाल का उपयोग करते हैं, मुख्य रूप से शेल को पारित करने के लिए, एक और शेल ( sh -c) जिसमें हम "पिछले दरवाजे" को चलाने के लिए कमांड के हमारे स्ट्रिंग।

और भी हैं लेकिन मैं यहां रुकूंगा। ये केवल आपको यह दिखाने के लिए हैं कि यदि आप चीजों को समझते हैं तो आप क्या कर सकते हैं, लेकिन जरूरी नहीं कि चेन जंक ही एक साथ हो क्योंकि आप कर सकते हैं, आपको कोशिश करनी चाहिए और अपने कोड को तार्किक स्तर पर रखना चाहिए जो समझ में आता है ताकि दूसरों को समझ और समर्थन दोनों मिल सकें भविष्य में उन्हें।


6

नहीं, आपके उदाहरण में केवल fooद्वारा निष्पादित किया जाता है sudo। यदि आप सभी विशेषाधिकारों के साथ कमांड चलाना चाहते हैं, तो आप एक शेल स्पॉन कर सकते हैं:

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