एक स्क्रिप्ट के केवल भागों को sudo के रूप में चलाएं, केवल एक बार पासवर्ड दर्ज करें


14

मैं एक स्क्रिप्ट लिख रहा हूं (वास्तव में स्क्रिप्ट और मेकफाइल का एक संयोजन) जो बाहरी निर्भरता स्थापित करता है: कुछ apt-getकमांड, कुछ gitक्लोनिंग, निर्माण, स्थापित करना, उपयोगकर्ताओं को समूहों में जोड़ना, ...

इन लिपियों में कुछ प्रचालनों के लिए सुपरयुसर अनुमतियों की आवश्यकता होती है, कुछ नहीं।

अब तक मैंने सुडो के साथ पूरी प्रक्रिया को चलाया है, लेकिन इसमें कुछ कमियां हैं:

  • gitरेपोस मैं क्लोन rootजिसका मतलब है कि मैं उनके बिना बाद में संशोधित नहीं कर सकते मालिक के रूप में, sudoयाchown
  • स्क्रिप्ट जो उपयोगकर्ताओं को समूहों में जोड़ते हैं, वे यह नहीं जानते कि whoamiरिटर्न के बाद कौन सा उपयोगकर्ता जोड़ना हैroot

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

मैंने जो समाधान ऑनलाइन पाया है उनमें शामिल हैं:

  • sudo -vस्क्रिप्ट की शुरुआत में, लेकिन अगर मैं इस बार सही ढंग से समझूं। मेरी स्क्रिप्ट कुछ घंटों के लिए चल सकती है
  • स्क्रिप्ट के साथ चल रहा है sudo, लेकिन आदेशों के साथ सुपरयुजर की आवश्यकता नहीं है sudo -u $(logname) <command>। यह वही है जो मैं अभी करता हूं, लेकिन ऐसा महसूस होता है कि इसे दूसरे तरीके से होना चाहिए।

आदर्श रूप में, मुझे अपनी स्क्रिप्ट पसंद आएगी:

  1. सुपरसुअर क्रेडेंशियल्स के लिए पूछें
  2. उपयोगकर्ता में लॉग के रूप में सामान्य कमांड चलाएं
  3. चरण 1 में दर्ज क्रेडेंशियल्स के साथ सुडो कमांड चलाएं
  4. sudo -k सुपरयुसर सत्र को बंद करने के लिए

2
आप अभी भी सब कुछ sudo के रूप में चला सकते हैं, और आपकी स्क्रिप्ट SUDO_USERपर्यावरण चर की जांच कर सकती है । यदि मौजूद है, तो इसमें sudo का उपयोग करने वाला उपयोगकर्ता का उपयोगकर्ता नाम होगा। तो आप (रूट के रूप में) $ SUDO_USER को चुन सकते हैं: $ SUDO_GID $ your_files। इसी तरह, आप इन चरों की जांच कर सकते हैं ताकि आपके एड्यूसर कमांड को पता चल सके कि किस यूज़र को जोड़ना है।
रोडमैर

... या सब कुछ रूट के रूप में चलाते हैं और su $SUDO_USER -c commandकमांड के लिए उपयोग सामान्य उपयोगकर्ता के रूप में चलाते हैं।
रमनो

जवाबों:


7

चूँकि आपके पास sudo एक्सेस है, अपने लिए एक sudoers फ़ाइल बनाएँ, फिर स्क्रिप्ट के पूरा होने पर इसे हटा दें:

# grant this user access to the sudo commands without passwords
# add all required cmds to the CMDS alias
sudo tee /etc/sudoers.d/$USER <<END
$USER $(hostname) = NOPASSWD: /usr/bin/apt-get, /usr/sbin/adduser, /bin/rm, ...
END

# your script goes here
sudo apt-get install ...
git clone ...
sudo adduser group2 $USER
sudo adduser group1 $USER
: ...

# then, remove the sudo access
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k

2

एक तरीका यह है कि मैं आम तौर पर की सिफारिश नहीं होगा, पासवर्ड अपने आप में पढ़ने के लिए है, और उपयोग sudoके -Sरूप में और जब जरूरत विकल्प पासवर्ड पारित करने के लिए:

#! /bin/bash
IFS= read -rsp 'Enter your password: ' password
git clone ...
sudo -S apt-get install foo -y <<<"$password"

से man sudo:

 -S, --stdin
             Write the prompt to the standard error and read the password
             from the standard input instead of using the terminal device.
             The password must be followed by a newline character.

1
क्या वह सुरक्षित है? echo "$password"??
α atsнιη

@ KasiyA echo "$password"नहीं होगा, लेकिन heredocs और herestrings थोड़ा अधिक सुरक्षित हैं। वे सामान्य टूल द्वारा दिखाए गए कमांड लाइन पर दिखाई नहीं देते हैं।
मूरू

1
मुझे लगता है कि, सख्ती, बोलने echo "$password"पर एक पाइप के बाईं ओर है एक bash लिपि में सुरक्षित। echoशेल निर्मित है; /bin/echoजब यह बस के रूप में कहा जाता है नहीं चलता है echo ...। कुछ अन्य गोले में एक echoअंतर्निहित ( dashउदाहरण के लिए) है, लेकिन बॉर्न-शैली के गोले के लिए एक की आवश्यकता नहीं है । इसलिए मुझे लगता echo "$password" |है कि बैश में स्वीकार्य है, लेकिन किसी मामले को नोट किए बिना स्क्रिप्ट को किसी अन्य शेल में पोर्ट करने से सबसे अच्छा बचा जा सकता है। मैं एक गैर पोर्टेबल का उपयोग [[करने के बजाय [में है कि स्क्रिप्ट समस्या का एक ही प्रकार से बचने के लिए। @ कासिया
कगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.