बैश, एक नया शेल लागू करने के बाद कमांड निष्पादित करें


12

मैं इस तरह से एक स्क्रिप्ट बनाने की कोशिश कर रहा हूं:

#!/bin/bash
sudo -s
something...

जब मैं इसे निष्पादित करता हूं, मुझे एक नया शेल मिलता है, लेकिन somethingइसे तभी निष्पादित किया जाता है जब मैं इसके द्वारा बनाए गए शेल से बाहर निकलता हूं sudo -s, इसके अंदर नहीं।

कोई मदद?

जवाबों:


7

समस्या sudo -sबिना किसी तर्क के जड़ के लिए एक इंटरैक्टिव खोल देगी।

यदि आप केवल एक कमांड का उपयोग करके चलाना चाहते हैं sudo -s, तो आप सरल कार्य कर सकते हैं:

sudo -s command

उदाहरण के लिए :

$ sudo -s whoami
root

या आप यहाँ तार का उपयोग कर सकते हैं:

$ sudo -s <<<'whoami'
root

यदि आपके पास कई कमांड हैं, तो आप यहां डॉक्टर का उपयोग कर सकते हैं:

$ sudo -s <<'EOF'
> whoami
> hostname
> EOF
root
something--

1
यह उपयोग करने के लिए अच्छा नहीं है sudo -sसिर्फ मामले में rootउपयोगकर्ता (बल्कि गरीब) विचार इसके खोल बदलना पड़ा। यह वास्तव में होना चाहिए sudo shजो स्पष्ट रूप से बताता है कि किस शेल का उपयोग किया जाना है।
माइकल ले बारबियर ग्रुएनवाल्ड

7

एक और तरीका यह होगा कि आप पूरी 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

3

बॉर्न शैल एक है -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


0

आपको अगली पंक्ति के बजाय, sudo -s के आगे कमांड जोड़ने की आवश्यकता है।

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