गैर-संवादात्मक स्क्रिप्ट में sudo


9

मेरे पास एक स्क्रिप्ट है जो तीन कार्यों को निष्पादित करती है A && B && C:।

फ़ंक्शन Bको सुपर-उपयोगकर्ता के रूप में चलाने की आवश्यकता है, जबकि Aऔर Cनहीं।

मेरे पास कई समाधान हैं लेकिन इनमें से कोई भी संतोषजनक नहीं है:

  1. संपूर्ण लिपि को सूदो: sudo 'A && B && C'

    यह चलाने के लिए एक बुरे विचार की तरह लगता है Aऔर Cसुपर-उपयोगकर्ता के रूप में यदि इसकी आवश्यकता नहीं है

  2. स्क्रिप्ट को इंटरैक्टिव बनाएं: A && sudo B && C

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

  3. बेवकूफ समाधान: sudo : && A && sudo -n B && C

    पहले यह पहले से नहीं चलाने के लिए बेवकूफ लग रहा है sudo, और मुझे अपनी उंगली को पार करना होगा कि ए इससे अधिक नहीं लेने वाला है $sudo_timeout

  4. Hypothetical solution

    sudo --store-cred 'A && sudo --use-cred-from-parent-sudo B && C'

    यह शुरुआत में मेरे पासवर्ड के लिए संकेत देगा, और फिर जरूरत पड़ने पर ही उस क्रेडेंशियल्स का उपयोग करें।

इस सब पर आपकी क्या राय है? मुझे बहुत आश्चर्य होगा कि उस समस्या का कोई हल नहीं है, क्योंकि मुझे लगता है कि यह एक सामान्य समस्या है (क्या है make all && sudo make install)


3
आप एक स्क्रिप्ट बना सकते हैं जिसे आप sudo के साथ निष्पादित करते हैं, लेकिन स्क्रिप्ट में स्पष्ट रूप से उपयोग किए जाने वाले भागों Aऔर Cभागों को निष्पादित करते हैं su -l some_non_priviliged_user। कोई समयबाह्य समस्याएँ, और A और C. के लिए कोई भी priveliges मुझे नहीं लगता कि 4 संभव है, sudoएक उपयोगकर्ता के लिए "वैश्विक स्थिति" प्रतीत होती है।
एंथन

जवाबों:


7

मुझे लगता है कि सबसे अच्छी बात आप कर सकते हैं उस के साथ स्क्रिप्ट का शुभारंभ है sudoऔर उसके बाद की प्रक्रिया आप के साथ स्पष्ट रूप से एक सामान्य उपयोगकर्ता के रूप चलाना चाहते लांच su userया sudo -u user:

#!/usr/bin/env bash

## Detect the user who launched the script
usr=$(env | grep SUDO_USER | cut -d= -f 2)

## Exit if the script was not launched by root or through sudo
if [ -z $usr ] && [ $USER = "root" ]
then
    echo "The script needs to run as root" && exit 1
fi

## Run the job(s) that don't need root
sudo -u $usr commandA

## Run the job that needs to be run as root
commandB

9

अपनी स्क्रिप्ट को विशेषता के /etc/sudoersसाथ फ़ाइल में जोड़ें NOPASSWD, ताकि इसे पासवर्ड के लिए संकेत दिए बिना चलाने की अनुमति हो। आप इसे किसी विशिष्ट उपयोगकर्ता (या उपयोगकर्ताओं के सेट) से जोड़ सकते हैं, या इसे sudoआपके सिस्टम पर किसी के भी साथ चलाने की अनुमति दे सकते हैं।

स्क्रिप्ट के लिए एक नमूना रेखा /usr/local/bin/bossyकुछ इस तरह दिख सकती है

ALL ALL = (root) NOPASSWD: /usr/local/bin/bossy

और फिर आप कुछ इस तरह का उपयोग करेंगे

A && sudo bossy && C

इस उदाहरण के लिए मैं मान लिया PATHशामिल /usr/local/bin। यदि नहीं, तो बस स्क्रिप्ट के लिए पूर्ण पथ का उपयोग करें, अर्थातsudo /usr/local/bin/bossy


सबसे सुरक्षित दृष्टिकोण के लिए Upvote।
eyoung100

0

आप !requirettyविकल्प के sudoसाथ-साथ विकल्प का उपयोग करना चाह सकते हैं NOPASSWD। लेकिन ध्यान रखें कि यह सुरक्षा को कम करता है।


1
जैसा कि समस्या को परिभाषित किया जाना चाहिए क्योंकि स्क्रिप्ट इंटरैक्टिव नहीं होना चाहिए, # 2 /etc/sudoersउपयोगकर्ता के लिए कमांड के Bसाथ प्रविष्टि करने के लिए प्रविष्टि NOPASSWDसही उत्तर है।
एंड्रयू

यह "आप एक्स या वाई कर सकते हैं", यह "आप एक्स और वाई कर सकते थे"। दोनों ही समस्या का समाधान करेंगे। शायद मुझे अपना जवाब दोबारा देना चाहिए।
स्टीव ने

0

सूडो को अधिकृत करने के लिए मेरे उत्तर पर निर्माण ? (इसलिए इसे बाद में चलाया जा सकता है) , दो स्क्रिप्ट लिखें:

  • ABC_script:

    #!/bin/sh
    sudo -b ./B_script
    A  &&  > A_is_done
    while [ ! -f B_is_done ]
    do
            sleep 60
    done
    rm -f B_is_done
    C
  • B_script:

    #!/bin/sh
    while [ ! -f A_is_done ]
    do
            sleep 60
    done
    rm -f A_is_done
    B  &&  > B_is_done

रन ./ABC_script:

  • यह चलेगा sudo -b ./B_script। यह पासवर्ड के लिए पूछता है ( आपके चलने के तुरंत बाद ABC_script)। यह मानते हुए कि सही पासवर्ड दर्ज किया गया है, यह रूट के रूप B_scriptमें b ackground (क्योंकि -bनिर्दिष्ट किया गया था) में घूमता है। इसके बराबर लगता है sudo sh -c "./B_script &"
  • B_scriptसमानांतर रूप से, अतुल्यकालिक रूप से चलना शुरू कर देता है ABC_script।  B_scriptनामक फ़ाइल के अस्तित्व के लिए परीक्षण A_is_done और प्रकट होने तक लूप्स।
  • समानांतर में, ABC_scriptचलाता है A। यदि / जब Aसफलतापूर्वक समाप्त हो जाता है, तो स्क्रिप्ट नामक एक फ़ाइल बनाता है A_is_done
  • ABC_scriptतब नामक फ़ाइल के अस्तित्व के लिए परीक्षण B_is_done और प्रकट होने तक लूप्स।
  • समानांतर में, B_scriptके अस्तित्व का पता लगाता है A_is_doneऔर लूप से बाहर निकलता है। यह A_is_doneफ़ाइल को हटाता है और चलाता है B। याद रखें, B_scriptजड़ के रूप में चल रहा है, इसलिए यह Bजड़ के रूप में चलता है। यदि / जब Bसफलतापूर्वक समाप्त हो जाता है, तो स्क्रिप्ट नामक एक फ़ाइल बनाता है B_is_doneऔर बाहर निकलता है।
  • समानांतर में, ABC_scriptके अस्तित्व का पता लगाता है B_is_doneऔर लूप से बाहर निकलता है। यह B_is_doneफ़ाइल को हटाता है । याद रखें, B_scriptरूट के रूप में भाग गया, इसलिए रूट के B_is_doneस्वामित्व में है, और आप rm -fपुष्टि के लिए अनुरोध प्राप्त करने से बचने के लिए उपयोग करना चाहते हैं । ABC_scriptफिर चलाता है Cऔर बाहर निकलता है।

आगे शोधन के लिए नोट:

  • ABC_scriptशायद B_scriptएक निरपेक्ष मार्ग से चलना चाहिए ./
  • इसके बजाय A_is_doneऔर B_is_done, ABC_scriptशायद यादृच्छिक, अद्वितीय फ़ाइल नाम उत्पन्न करना चाहिए।
  • स्क्रिप्ट के लिए एक प्रावधान होने की आवश्यकता है जो स्पिन-वेटिंग को अधिसूचित करने के लिए है यदि वह प्रोग्राम जिसका वह इंतजार कर रहा है लेकिन वह विफल हो गया है। (अभी, यदि Aविफल रहता है, तो दोनों स्क्रिप्ट बस एक अनन्त प्रतीक्षा लूप में जाती हैं।) यह बदलने के रूप में सरल हो सकता है

    A  &&  > A_is_done

    सेवा

    A; echo $? > A_is_done

    और फिर X_is_doneफ़ाइलों को पढ़ने के लिए स्पिन-वेट्स को संशोधित करना , और आगे बढ़ें यदि इसमें 0 हो और अन्यथा बाहर निकलें।


-3

गूंगा हो। कई लाइनों का उपयोग करें।

if A; then

    if sudo B ; then
        C
    fi
fi

मेरी चिंता का कोई हल कैसे है? समस्या का इससे कोई लेना-देना नहीं है&&
एंटोनी पेलिस

पहला आदेश विफल होने पर && निष्पादन रोक देता है। यदि कथनों में यह अधिक मौखिक है। मेरा कहना है कि आपका काम पूरा हो जाए, भले ही यह सुंदर न हो।
राबर्ट जैकब्स

1
यह विकल्प 2 के अधिक वर्बोज़ संस्करण से अधिक कुछ नहीं है A && sudo B && C:। जैसे एंटोनी सवाल में बताते हैं; यह तब तक पासवर्ड के लिए नहीं कहता है, जब तक Aकि वह समाप्त नहीं हो जाता है, और वह उसके लिए इंतजार नहीं करना चाहता है, या स्क्रिप्ट उसके लिए इंतजार करना चाहती है।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.