Sudo पासवर्ड के लिए प्रॉम्प्ट और प्रोग्राम स्क्रिप्ट को bash स्क्रिप्ट में विशेष रूप से उन्नत करें?


49

मैं वर्तमान में एक bash स्क्रिप्ट पर काम कर रहा हूं जो स्टॉक लिनक्स सिस्टम (वर्तमान में, उबंटू) पर विभिन्न कार्यक्रमों को स्थापित और सेट करता है। क्योंकि यह प्रोग्राम स्थापित करता है और विभिन्न फ़ोल्डरों के लिए कई फाइलों की प्रतिलिपि बनाता है जिन्हें एलिवेटेड विशेषाधिकारों की आवश्यकता होती है, मैंने पहले ही मानक "मुझे एलिवेटेड विशेषाधिकारों की आवश्यकता है" और-बाहर निकलें।

हालाँकि, मैं चाहूंगा, यदि संभव हो, तो उपयोगकर्ता को अपने sudo पासवर्ड के लिए संकेत देने में सक्षम होने के लिए और स्क्रिप्ट के विशेषाधिकारों को स्वचालित रूप से बढ़ा दें यदि उपयोगकर्ता sudo के साथ स्क्रिप्ट कमांड नहीं चलाता है (जैसे कि GUI फ़ाइल प्रबंधक से इसे लॉन्च करना), उपयोगकर्ता के बिना स्क्रिप्ट को पुनरारंभ करने के लिए।

जैसा कि यह स्टॉक लिनक्स इंस्टॉल पर चलने के लिए डिज़ाइन किया गया है, सिस्टम को संशोधित करने वाला कोई भी विकल्प मेरे उद्देश्यों के लिए काम नहीं करेगा। सभी विकल्पों को स्क्रिप्ट में ही समाहित करने की आवश्यकता है।

क्या यह बैश के भीतर संभव है? यदि हां, तो ऐसा करने के लिए सबसे अच्छा (सुरक्षित, अभी तक संक्षिप्त) तरीका क्या है?



@MichaelMrozek - आह, विखंडन को कम करने की कोशिश करते हुए बहुत सारे आला साइट होने की खुशियाँ। और आप जानते हैं, आपने जो लिंक दिया था वह एक बार Google सर्च करते समय मेरे लिए कभी नहीं आया।
शौना


@jww आपको एहसास है कि लगभग सभी लिंक इस एक के बाद 4 साल के बारे में पूछे गए थे , है ना?
शौना

1
@ शुना - मैं अनुमान लगा रहा हूं कि आपने अब तक समस्या हल कर ली है। लिंक भविष्य के आगंतुकों के लिए हैं।

जवाबों:



16

मैं सुझाव देता हूँ:

#!/bin/bash

if (($EUID != 0)); then
  if [[ -t 1 ]]; then
    sudo "$0" "$@"
  else
    exec 1>output_file
    gksu "$0 $@"
  fi
  exit
fi

# some example stuff
ls -l /root
echo "app: $0"
for f; do
  echo ">$f<"
done

क्या if [[ -t 1 ]];जाँच करता है?
शौनु

आह अच्छा। मुझे लगा कि टर्मिनल बनाम GUI के साथ इसका कुछ करना है, लेकिन यह निश्चित नहीं था कि यदि स्टेटमेंट स्वयं जाँच रहा हो।
शौना

कमाल है, धन्यवाद!
फायर-ड्रैगन-डीओएल

16

इसे स्क्रिप्ट की पहली पंक्ति के रूप में जोड़ें:

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

बदले sudoके लिए gksuया gksudoआप एक ग्राफिकल शीघ्र पसंद करते हैं।


3
ध्यान दें कि "$*"एक में सभी तर्कों विलय करने के लिए जा रहा है ( /path/to/script one two threeमें परिणाम जा रहा है $1जा रहा है one two three), और $*बिना उद्धरण होगा बहस में रिक्त स्थान गंदगी। "$@"सही काम करता है
माइकल Mrozek

@MichaelMrozek आह, सही है। वह वही है जिसकी मैं तलाश कर रहा था,
केविन

क्या डेबियन पर ऐसा करने का कोई तरीका है, जहां कोई sudo कमांड नहीं है?
गलत

@wrongusername इंस्टॉल करें sudo, यह उपयोग करने से बहुत बेहतर है su। लेकिन अगर आप वास्तव में चाहते हैं, तो शायदexec su -c "$0" "$@"
केविन

2

उदाहरण स्क्रिप्ट मैं साझा करने का मन नहीं है ::

#!/bin/bash
[ "$UID" -eq 0 ] || exec sudo "$0" "$@" && echo -n "sudo bash what: "
read WHAT
sudo $WHAT

--ImP.TeK


[ "$UID" -eq 0 ] || exec sudo "$0" "$@"- एक कुशल एक लाइनर की तरह लग रहा है! अच्छा!
ग्रूवेक्टेकर

यह प्रभावी यूआईडी का उपयोग करने के लिए समझ में आएगा $EUDI, या हमेशा एक ही परिणाम? जैसे,[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
ग्रूवेनटेकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.