जवाबों:
समस्या sudo -s
बिना किसी तर्क के जड़ के लिए एक इंटरैक्टिव खोल देगी।
यदि आप केवल एक कमांड का उपयोग करके चलाना चाहते हैं sudo -s
, तो आप सरल कार्य कर सकते हैं:
sudo -s command
उदाहरण के लिए :
$ sudo -s whoami
root
या आप यहाँ तार का उपयोग कर सकते हैं:
$ sudo -s <<<'whoami'
root
यदि आपके पास कई कमांड हैं, तो आप यहां डॉक्टर का उपयोग कर सकते हैं:
$ sudo -s <<'EOF'
> whoami
> hostname
> EOF
root
something--
एक और तरीका यह होगा कि आप पूरी bash कमांड को पास करें sudo
:
#!/bin/bash
sudo bash -c 'command1; command2; command3;'
हालांकि, एक बेहतर तरीका शुरू करने के लिए किया जाएगा स्क्रिप्ट के साथ sudo
बजाय। sudo
स्क्रिप्ट के अंदर होना बहुत अच्छा विचार नहीं है । रूट विशेषाधिकारों ( sudo script.sh
) के साथ पूरी स्क्रिप्ट को चलाने के लिए बेहतर है । यदि आवश्यक हो, तो आप sudo
विशिष्ट आदेशों के लिए विशेषाधिकारों को छोड़ने के लिए उपयोग कर सकते हैं । उदाहरण के लिए:
#!/usr/bin/env bash
whoami
echo $HOME
sudo -u terdon whoami ## drop privileges for specific command.
रिटर्न के ऊपर स्क्रिप्ट चलाना:
$ sudo ~/scripts/a.sh
root
/root
terdon
बॉर्न शैल एक है -c
झंडा है जो आप खोल करने के लिए मनमाने ढंग से स्क्रिप्ट पारित करने के लिए उपयोग कर सकते हैं कि आप की तरह कुछ लिख सकते हैं, तो
sudo sh -c 'something'
यह हालांकि सरलतम कमांड के लिए केवल उपयोगी है, क्योंकि यह स्क्रिप्ट को सही ढंग से उद्धृत करने के लिए बहुत ही बोझिल है और असुविधा तब अधिक होती है जब आप कमांड को ssh के रिमोट सर्वर पर भेजते हैं क्योंकि तर्क स्क्रिप्ट का दो बार विश्लेषण किया जाएगा, एक बार साइड पर स्क्रिप्ट भेजना और एक बार स्क्रिप्ट चलाना।
यदि something
एक जटिल स्क्रिप्ट है या एक पर पारित किए जाने की आवश्यकता ssh लाइन है, यह आम बात एक समारोह लिखने के लिए है prepare_something_script
जिनका काम पर स्क्रिप्ट 'कुछ' लिखने के लिए stdout । अपने सरलतम रूप में, यह फ़ंक्शन अपने आउटपुट को उत्पन्न करने के लिए यहां एक दस्तावेज़ का उपयोग कर सकता है:
prepare_something_script()
{
cat <<EOF
something
EOF
}
इसके prepare_something_script
बाद निर्मित स्क्रिप्ट को स्थानीय रूप से सुडो द्वारा दिए गए विशेषाधिकारों के साथ निष्पादित किया जा सकता है:
prepare_something_script | sudo sh
परिदृश्य में जहां स्क्रिप्ट को सुडो द्वारा दिए गए विशेषाधिकारों के साथ दूरस्थ रूप से निष्पादित किया जाना चाहिए , यह इस तरह से ssh के मानक इनपुट को पुनर्निर्देशित करने से बचने के लिए स्क्रिप्ट को आधार 64 में एन्कोड करने के लिए प्रथागत है :
something64=$(prepare_something_script | base64)
ssh usesr@remote-host "echo ${something64} | base64 --decode | sudo sh"
यदि आप किसी फ़ंक्शन में उस कोड का उपयोग करते हैं, तो स्थानीय के रूप में कुछ चर को चिह्नित करना न भूलें । बेस 64 के कुछ कार्यान्वयन डिकोड करने के लिए एक ध्वज प्रदान करते हैं , जो क्रिया संस्करण की तुलना में कम अच्छी तरह से समर्थित है । कुछ क्रियान्वयनों को स्फूर्त रेखा विराम से बचने के लिए एन्कोडिंग कमांड में जोड़ना पड़ता है।-d
--decode
-w 0
sudo -s
सिर्फ मामले मेंroot
उपयोगकर्ता (बल्कि गरीब) विचार इसके खोल बदलना पड़ा। यह वास्तव में होना चाहिएsudo sh
जो स्पष्ट रूप से बताता है कि किस शेल का उपयोग किया जाना है।