बैश स्क्रिप्ट में सुडो का उपयोग करने पर सबसे अच्छा अभ्यास


11

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

मैं कुछ तरीकों के साथ आया था, लेकिन उनमें से प्रत्येक में कुछ समस्याएं हैं

विधि 1: फ़ाइल के अंदर sudo का उपयोग करना

#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"

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

विधि 2: फ़ाइल को कॉल करने के लिए sudo का उपयोग करना और फिर ज़रूरत पड़ने पर मूल उपयोगकर्ता में वापस बदलना

#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"

यह भी बेकार है, क्योंकि मुझे su username -cलगभग हर पंक्ति के सामने जोड़ने की आवश्यकता है । इसके अलावा मूल उपयोगकर्ता नाम खोजना sudoसंभव है, लेकिन बोझिल है।

क्या कोई बेहतर तरीका है?

संपादित करें: मैं केवल छोटी, निरर्थक लिपियों को यहां पोस्ट करता हूं, यह दिखाने के लिए कि मैं किस बारे में बात कर रहा हूं। वास्तविक लिपि में मेरी कुछ पंक्तियाँ हैं, जिन्हें sudo (शुरू और रुकने वाली सेवाएँ) की आवश्यकता है, कुछ पंक्तियाँ जहाँ यह मायने नहीं रखती हैं अगर वहाँ sudo है और काफी लाइनें हैं जिन्हें वास्तव में sudo के बिना चलाने की आवश्यकता है।


4
इसकी बहुत कम जरूरत है। ज्यादातर मामलों में, आप स्क्रिप्ट को केवल उसी के साथ चलाते हैं, sudoअगर उसके लिए एलिवेटेड अनुमतियां होनी चाहिए। लेकिन su username -cचलाने के लिए स्विच करने का कोई मतलब नहीं है echo। दूसरे शब्दों में, यह एक [XY] जैसा लगता है। क्या आप संपादित कर सकते हैं और समझा सकते हैं कि आपकी स्क्रिप्ट वास्तव में क्या कर रही है और आपको ऐसा क्यों लगता है कि आपको उपयोगकर्ताओं को इतनी बार स्विच करने की आवश्यकता है?
टेराडॉन

1
@ElderGeek क्या आपने गलत लिंक पेस्ट किया है? यह भी संबंधित नहीं लगता है। यह शायद एक स्क्रिप्ट के अंदर 'sudo' कमांड को चलाने के तरीके का एक डुप्लिकेट है लेकिन मुझे उम्मीद है कि ओपी थोड़ा और समझा सकता है।
टेराडॉन

@terdon ऐसा प्रतीत होता है। सफाई करना।
एल्डर गीक

यह केवल एक उदाहरण लिपि है। मैं यहां 200+ लाइन की स्क्रिप्ट चिपकाना नहीं चाहता था। मैं अधिक विवरण के लिए उत्तर को संपादित करूंगा।
डकारन

क्या आपने मान्य विकल्प पर विचार किया है, जिसमें वर्णित है man sudo? -v, --validate 'उपयोगकर्ता की कैश्ड क्रेडेंशियल्स को अपडेट करें, यदि आवश्यक हो तो उपयोगकर्ता को प्रमाणित करें। Sudoers प्लगइन के लिए, यह sudo टाइमआउट को डिफ़ॉल्ट रूप से एक और 15 मिनट तक बढ़ाता है, लेकिन कमांड नहीं चलाता है। सभी सुरक्षा नीतियां कैशेड क्रेडेंशियल्स का समर्थन नहीं करती हैं। ' (यदि आप इसे अक्सर पर्याप्त रूप से चलाते हैं, तो
सूडो ऑथेंटिकेशन

जवाबों:


5

विधि 2 के बारे में, फ़ंक्शन का उपयोग करना आसान है। उदाहरण के लिए:

#!/bin/bash

func(){
    echo "Username: $USER"
    echo "    EUID: $EUID"
}

export -f func

func
su "$SUDO_USER" -c 'func'

$SUDO_USERsudoer का उपयोगकर्ता नाम है। आप भी $(logname)इसके स्थान पर उपयोग कर सकते हैं ।

मेरी मशीन पर चल रहा है:

$ sudo bash test.sh
[sudo] password for wja: 
Username: root
    EUID: 0
Username: wja
    EUID: 1000

2

पढ़ने से man sudoers, एक देखता है:

 PASSWD and NOPASSWD

   By default, sudo requires that a user authenticate him or herself
   before running a command.  This behavior can be modified via the
   NOPASSWD tag.  Like a Runas_Spec, the NOPASSWD tag sets a default for
   the commands that follow it in the Cmnd_Spec_List.  Conversely, the
   PASSWD tag can be used to reverse things.  For example:

   ray     rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm

   would allow the user ray to run /bin/kill, /bin/ls, and /usr/bin/lprm
   as root on the machine rushmore without authenticating himself. 

इस प्रकार, आप regularहोस्ट machine1को निष्पादित करने की अनुमति दे सकते हैं command1और command2रूट के रूप में, पासवर्ड प्रमाणीकरण के बिना :

reguser machine1 root = NOPASSWD: /usr/local/command1, /usr/local/command2  

लेकिन man -k sudoविवरण के लिए प्रत्येक पढ़ें ।


0

शायद यह मदद कर सकता है:

chmod 775 yourcript.sh

फिर आप स्क्रिप्ट के अंदर sudo का उपयोग कर सकते हैं (पासवर्ड प्रॉम्प्ट के बिना) और अपनी स्क्रिप्ट के अंदर अन्य कमांड के लिए sudo का उपयोग नहीं कर सकते।


मुझे डर है कि काम नहीं करेगा। chmod 775केवल आपको फ़ाइल निष्पादित करने की अनुमति देता है और उस उपयोगकर्ता को नहीं बदलता है जो फ़ाइल या उनके अधिकारों को निष्पादित कर रहा है।
डकारन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.