एक स्क्रिप्ट के भीतर से रूट विशेषाधिकार का अनुरोध करें


23

मेरे पास एक स्क्रिप्ट है जो sudo script.shया के रूप में चल सकती हैpkexec script.sh

यदि उपयोगकर्ता नाम से पासवर्ड मांगता है, तो यह उपयोगकर्ता के दृष्टिकोण से बहुत अच्छा होगा script.sh

मैं कैसे "एम्बेड" करने के लिए अनुरोध कर सकते हैं pkexecया sudoमूल विशेषाधिकार के साथ पूरी स्क्रिप्ट चलाने के लिए?

ध्यान दें कि sudo sh -cस्क्रिप्ट में फ़ंक्शंस होने के साथ सब कुछ सही नहीं हो सकता है।

जवाबों:


55

यह काम करेगा:

echo "$(whoami)"

[ "$UID" -eq 0 ] || exec sudo "$0" "$@"

उदाहरण:

./test.sh 
blade
[sudo] password for blade: 
root

3
इसके बारे में क्या अच्छा है, इसके साथ पुनरावृत्ति है exec- स्वयं कॉल करें, लेकिन साथ ही साथ प्रक्रिया को प्रतिस्थापित भी कर रहे हैं, इसलिए हम स्क्रिप्ट के कई उदाहरणों को नहीं
खोलते हैं

1
बचाव के लिए पुनरावृत्ति !!! कुछ दिनों में इस एक को जोड़ने के लिए मुझे याद दिलाएं!
फैबी

6
ऐसा करते समय कुछ जागरूक होना विशेषाधिकार वृद्धि है; मूल रूप से, जितने अधिक कमांड आप रूट के रूप में चलाते हैं, उतने ही अधिक अवसर दुर्भावनापूर्ण हैकर के लिए किसी रूट खाते तक पहुंचने के लिए कुछ का फायदा उठाने के लिए होते हैं। मैं यह नहीं कह रहा हूं कि पूरी स्क्रिप्ट को रूट के रूप में चलाना हमेशा गलत है, लेकिन ऐसा करने का निर्णय लेने से पहले इसमें थोड़ा विचार करना उचित है। मुझे लगता है कि यह अच्छा होगा (हालांकि आवश्यक नहीं) यदि उत्तर उस पर स्पर्श करेगा।
डेविड जेड

यदि आपके पास / etc / sudoers में एक अच्छा टाइमआउट मान सेट है, तो आप वैकल्पिक रूप से स्क्रिप्ट में प्रत्येक कमांड के सामने sudo रख सकते हैं, जिसे वास्तव में रूट एक्सेस की आवश्यकता है और यह केवल एक बार पूछेगा। एक बात जो मुझे अक्सर गड़बड़ करती है, वह यह है कि इस तरह की स्क्रिप्ट को कॉल करने से काम नहीं चलेगा क्योंकि पासवर्ड इनपुट के लिए sudo / dev / null मिलता है और विफल हो जाता है। यही कारण है कि gksudo और kdesudo को हैंडल करने के लिए डिज़ाइन किया गया था क्योंकि वे पासवर्ड मांगने के लिए gui का उपयोग करेंगे।
जो

1
@ Coder256: मुझे नहीं लगता कि आपका संपादन सही था। "$@"प्रत्येक पैरामीटर के लिए एक से अधिक शब्दों का विस्तार होगा।
jwodder

12

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

brand="My Software"

# Check that the script is running as root. If not, then prompt for the sudo
# password and re-execute this script with sudo.
if [ "$(id -nu)" != "root" ]; then
    sudo -k
    pass=$(whiptail --backtitle "$brand Installer" --title "Authentication required" --passwordbox "Installing $brand requires administrative privilege. Please authenticate to begin the installation.\n\n[sudo] Password for user $USER:" 12 50 3>&2 2>&1 1>&3-)
    exec sudo -S -p '' "$0" "$@" <<< "$pass"
    exit 1
fi

सुडोल संवाद

यह व्हिपटैल का उपयोग करता है, जिसे आप पहले से ही न होने पर स्थापित कर सकते हैं:

sudo apt-get install whiptail

1
आप एक चर में पासवर्ड क्यों बचा रहे हैं?
हेमायला

10
फोन मत करो exec echo [PASSWORD]! यह कमांड-लाइन पर पासवर्ड के साथ एक प्रक्रिया शुरू करेगा जिसे कोई भी उपयोगकर्ता देख सकता है। या तो बिल्ट-इन कमांड का उपयोग करें echo(बिल्ट-इन वर्जन के साथ फोर्स करें builtin echo) या बाशिज़म <<<(जैसे :) sudo ... <<< "$pass"; इन मामलों के लिए Sh और अन्य गोले यहाँ दस्तावेज़ हैं । इसके अलावा, पासवर्ड को उद्धृत करें यदि उसमें विशेष वर्ण हैं।
डेविड फ़ॉस्टर

वैकल्पिक रूप से, whiptailकमांड को एक अलग स्क्रिप्ट में रखें और कस्टम पासवर्ड प्रॉम्प्ट के साथ सौदा SUDO_ASKPASS=/path/to/askpass-with-whiptail.sh sudo -A -p "My password prompt" -- "$0" "$@"करने के लिए कुछ का उपयोग करें sudo
डेविड फ़ॉस्टर 01

@DavidFoerster यह काम कर सकता है, लेकिन तब आपको या तो दो स्क्रिप्ट की जरूरत होती है, या आप अपनी अस्थायी स्क्रिप्ट को एक अस्थायी फ़ाइल में लिखते हैं और फिर उसे sudo में भेज देते हैं।
माइकल हैम्पटन

ठीक है, हालांकि अन्य लोगों ने पहले ही उल्लेख कर दिया है कि एक चर के लिए पासवर्ड पारित करना अवांछनीय है। जिस तरह से आईडी अप्रोच यह नाम पाइप के लिए डायलॉग के आउटपुट को पास करने के लिए है जैसा कि मैंने यहां से पूछा
Sergiy Kolodyazhnyy

11

ब्लेड19899 का जवाब वास्तव में जाने का रास्ता है, हालांकि कोई भी उसे शेबंग sudo bashमें बुला सकता है :

#!/usr/bin/sudo bash
# ...

स्पष्ट चेतावनी यह तभी काम करेगी जब तक स्क्रिप्ट के साथ कॉल किया जाता है ./scriptऔर जैसे ही स्क्रिप्ट को कॉल किया जाता है, वैसे ही विफल हो जाएगा bash script


5
यह एक कारण है कि bash scriptस्क्रिप्ट लिखने के लिए आपको कमांड लाइन पर कभी भी टाइप नहीं करना चाहिए । स्क्रिप्ट निर्दिष्ट के अलावा और कुछ तो bashमें #!लाइन है, तो इसके साथ लागू bash scriptअसफल रहा है। अगर मैंने एक अजगर स्क्रिप्ट का उपयोग करने की कोशिश की bash script.pyतो यह भी विफल हो जाएगा।
कास्परड

1
आप इसे के साथ चला सकते हैं perl script, यद्यपि। पर्ल, वास्तव में बहुत अच्छा होने के प्रयास में, शेबंग लाइन की जांच करता है, और अगर यह पर्ल को आमंत्रित नहीं कर रहा है तो यह सही प्रोग्राम चलाता है।
tbodt

यह बुरा है क्योंकि यह स्क्रिप्ट में सूडो के साथ हर कमांड को चला रहा है। कुछ आदेशों को अलग करना बेहतर होता है जो वास्तव में सूडो की आवश्यकता होती है और जहां आवश्यक हो उन्हें जोड़ते हैं। इन sudo कॉल में कार्यों का मूल्यांकन शामिल न करें; उन्हें यथासंभव स्पष्ट और न्यूनतम होना चाहिए।
डगलस हेल्ड

@DouglasHeld जब मैं उससे सहमत हो सकता हूं, तो यही वह सवाल है जो पूछ रहा है: "मैं पूरी स्क्रिप्ट को रूट विशेषाधिकार के साथ चलाने के लिए pkexec या sudo को" एम्बेड "कैसे कर सकता हूं?"। बहुत यकीन है कि इसमें उपयोग के मामले होंगे जो ऐसा करने में सक्षम होंगे।
कोस

6

मैं स्क्रिप्ट के भीतर कमांड्स को प्रस्तुत करता हूं, जिसके साथ रूट एक्सेस की आवश्यकता होती है sudo- यदि उपयोगकर्ता ने पहले से अनुमति नहीं ली है, तो स्क्रिप्ट उस बिंदु पर पासवर्ड के लिए संकेत देती है।

उदाहरण

#!/bin/sh 
mem=$(free  | awk '/Mem:/ {print $4}')
swap=$(free | awk '/Swap:/ {print $3}')

if [ $mem -lt $swap ]; then
    echo "ERROR: not enough RAM to write swap back, nothing done" >&2
    exit 1
fi

sudo swapoff -a && 
sudo swapon -a

यह स्क्रिप्ट या तो के रूप में चलाया जा सकता है sudo <scriptname>या के रूप में <scriptname>। किसी भी स्थिति में यह पासवर्ड के लिए पूछेगा, केवल एक बार।


2
यहां मुद्दा यह है कि रूट एक्सेस की आवश्यकता वाले कई कमांड हो सकते हैं, जिसका अर्थ है कि sudo25 विभिन्न कमांडों के लिए कॉल करना निरर्थक है - एक बार सुशी को कॉल करना आसान है। हालांकि, कारण यह है कि आपकी स्क्रिप्ट केवल एक बार सुडो को बुलाती है क्योंकि सूडो में 15 मिनट का समय होता है - इससे अधिक समय लेने वाली आज्ञाओं को फिर से प्रस्तुत करने की आवश्यकता होगी। आपका तरीका बस काम करता है। । । जिस तरह से मुझे काम करने की आवश्यकता नहीं है।
सर्गी कोलोडियाज़नी

@ शेर एक छोटी सी स्क्रिप्ट के लिए, जिस तरह से मैं त्वरित और आसान था - मैं वास्तव में एक सुंदर प्रोग्रामर नहीं हूं!
चार्ल्स ग्रीन

आप इस पृष्ठ पर पोस्ट करने वाले सर्वश्रेष्ठ प्रोग्रामर हैं। आप सूडो का उपयोग ठीक उसी तरह से कर रहे हैं जैसा कि इसका उपयोग किया जाना चाहिए - केवल जहां आवश्यक हो और बहुत स्पष्ट परिणामों के साथ अपेक्षित हो।
डगलस हेल्ड

4

ऐसा प्रतीत होता है कि किसी और ने यहां स्पष्ट चिंता को संबोधित नहीं किया है। लाना sudoअपनी स्क्रिप्ट के भीतर है कि आप तो वितरित बुरा उपयोगकर्ता की आदतों को बढ़ावा देता है । (मैं मान रहा हूं कि आप इसे वितरित कर रहे हैं क्योंकि आप "उपयोगकर्ता के दृष्टिकोण से" उल्लेख करते हैं।)

सच्चाई यह है कि एप्लिकेशन और स्क्रिप्ट का उपयोग करने में एक दिशानिर्देश है जो बैंकिंग में सुरक्षा सिद्धांत के समान है: कभी भी अपनी व्यक्तिगत जानकारी किसी ऐसे व्यक्ति को न दें जो आपको कॉल करता है और कहता है कि वे "आपके बैंक से कॉल कर रहे हैं" , और जो मौजूद है इसी तरह के कारणों के लिए।

अनुप्रयोगों के लिए नियम है:

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

यदि आप अपना पासवर्ड टाइप कर रहे हैं क्योंकि आप sudoकमांड लाइन पर चले गए हैं, तो बढ़िया है। यदि आप इसे टाइप कर रहे हैं क्योंकि आप SSH कमांड चलाते हैं, तो ठीक है। यदि आप इसे अपने कंप्यूटर में लॉग इन कर रहे हैं, तो निश्चित रूप से बढ़िया है।

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

जाहिर है कि कमांड के एक अज्ञात सेट को चलाने के बारे में अलग और अतिरिक्त चिंताएं हैं root, लेकिन मैं यहां जो बात कर रहा हूं वह पासवर्ड पर ही सुरक्षा बनाए रखता है । यहां तक ​​कि एप्लिकेशन / स्क्रिप्ट को दुर्भावनापूर्ण मानते हुए भी, आप अभी भी चाहते हैं कि आपका पासवर्ड सुरक्षित रूप से अन्य अनुप्रयोगों को रोकने और दुर्भावनापूर्ण तरीके से उपयोग करने से रोकने के लिए संभाला जाए ।

तो, इसके लिए मेरी अपनी व्यक्तिगत प्रतिक्रिया है, अगर इसे मूल विशेषाधिकारों की जरूरत है, तो अपनी स्क्रिप्ट में रखना सबसे अच्छी बात है:

#!/bin/bash
[ "$UID" -eq 0 ] || { echo "This script must be run as root."; exit 1;}

# do privileged stuff, etc.

जबकि मैं आपके साथ पूरी तरह से सहमत हूं, एक उपयोगकर्ता जो यह जानते हुए भी कुछ करता है कि sudo script_nameजैसा वह करता है वह उतना ही कमजोर है, यह उतना ही है। शायद यह विचार बुरी आदतों को बढ़ावा देता है - मैं इसके बारे में कुछ नहीं कहूंगा। लेकिन कुंजी यह जान रही है कि एक कार्यक्रम क्या करता है, और यह उपयोगकर्ता की जिम्मेदारी है। यह ओपन-सोर्स सॉफ्टवेयर के पीछे का पूरा विचार है। मेरी अपनी स्क्रिप्ट के लिए, अच्छी तरह से। । । एक स्क्रिप्ट सादा पाठ है - उपयोगकर्ता इसे पढ़ सकते हैं यदि वे जानते हैं कि यह क्या करता है
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy यह समान है, लेकिन यदि आप अपना पासवर्ड सीधे स्क्रिप्ट में टाइप करते हैं तो यह वास्तव में बदतर है। सूडो के साथ चलने वाली एक स्क्रिप्ट अभी भी आपके पासवर्ड को नहीं जानती है।
वाइल्डकार्ड

1

मैंने इसे इस तरह किया:

echo -n "Enter password for sudo rights: "
read -s pass

echo $pass | sudo -S [your command here]

4
कम से कम अपने चर को उद्धृत करें।
मरू

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