अगर स्क्रिप्ट में सूडो की आवश्यकता होती है तो क्या उन्हें असफल होना चाहिए, या सूडो और प्रॉम्प्ट का उपयोग करना चाहिए?


26

मेरे पास एक स्क्रिप्ट है जो मुझे मेरी बैकलाइट चमक पर ठीक-ठीक नियंत्रण देती है और sudoचलाने की आवश्यकता होती है। यह अनिवार्य रूप से यह है:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | tee $backlight

और रहता है ~/bin/backlight-adjust। स्क्रिप्ट को sudoविशेषाधिकारों की आवश्यकता है , क्योंकि tee $backlightएक विशेषाधिकार प्राप्त स्थान पर लिखना है। यदि यह साथ नहीं चलता है तो यह विफल हो जाएगा sudo

इस दृष्टिकोण में एक समस्या है, क्योंकि मैं बस नहीं चला सकता sudo backlight-adjust, क्योंकि पर्यावरण में ~/binनहीं है, केवल मेरे वातावरण में है। तो मुझे दौड़ना पड़ेगा या कुछ इसी तरह का।$PATHsudosudo env "PATH=$PATH" backlight-adjust

वैकल्पिक रूप से, मैं इसे इस तरह लिख सकता था:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | sudo tee $backlight

और मुझे पासवर्ड के लिए संकेत दें।

दूसरा दृष्टिकोण मेरे लिए बेहतर काम करता है क्योंकि मुझे सुडो टाइप करने की याद नहीं है; यह मुझे संकेत देगा। और मैं अपने को $PATHबरकरार रख सकता हूं । यह समग्र रूप से अधिक सुविधाजनक लगता है, लेकिन क्या कोई कारण है कि मुझे इसे दूसरा तरीका नहीं करना चाहिए?

(मैं Xubuntu 14.04 चला रहा हूं और मेरा शेल GNU बैश 4.2.45 है, अगर इससे कोई फर्क पड़ता है।)


सुधारों के लिए धन्यवाद। मैं एक संशोधित डेबियन (LMDE) चला रहा हूं और मेरा sudoवास्तव में $PATHडिफ़ॉल्ट रूप से रहता है इसलिए मेरे पास यह समस्या नहीं है।
terdon

जवाबों:


27

व्यक्तिगत रूप से, मैं एक अलग दृष्टिकोण का उपयोग करूंगा। अपनी स्क्रिप्ट के लिए एक उपनाम बनाएं। इस लाइन को अपने में जोड़ें ~/.bashrc(या अन्य गोले में समतुल्य)

alias backlight-adjust='sudo ~/bin/backlight-adjust'

इस तरह, आपको इसे चलाने के लिए याद रखने के बारे में चिंता करने की आवश्यकता नहीं है sudoऔर आपको sudoस्क्रिप्ट में जोड़ने की आवश्यकता नहीं है । यह आपके लिए पूरी तरह से पारदर्शी होगा और जब आप कोशिश करेंगे और रन करेंगे तो बस अपना पासवर्ड पूछेंगे backlight-adjust


यह एक बहुत ही समझदार दृष्टिकोण की तरह लगता है, और बाकी सिस्टम पर कम से कम प्रभाव पड़ता है। +1।
जॉन फेमिनाला

दूसरी ओर, @JohnFeminella यदि आप कभी भी इस स्क्रिप्ट को किसी और के साथ साझा करना चाहते हैं, तो उन्हें उपनाम की भी आवश्यकता होगी। व्यक्तिगत रूप से, मुझे sudoवास्तविक स्क्रिप्ट में नहीं डालने का कोई कारण नहीं दिखता है , खासकर जब से आप आसानी से यह देख सकते हैं कि स्क्रिप्ट के कौन से तत्व वास्तव में मूल अनुमतियाँ हैं।
काइल स्ट्रैंड

@KyleStrand नहीं वे नहीं करेंगे। स्क्रिप्ट द्वारा बुलाया गया कमांड केवल एक्सेस न होने की शिकायत करेगा।
terdon

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

@KyleStrand हाँ, लेकिन कोई समस्या नहीं थी, ओपी के पास एकमात्र मुद्दा यह था कि वह "सूडो टाइप करने के लिए याद रखना नहीं चाहता था" इसके अलावा, स्क्रिप्ट पूरी तरह से पोर्टेबल होगी। मेरा कहना है कि उपनाम पूरी तरह से वैकल्पिक है और कुछ भी हल नहीं करता है, यह बस उपयोग करना आसान बनाता है।
terdon

7

मैं यह नहीं देख सकता कि यह गलत क्यों हो सकता है --- हालांकि मैं आमतौर पर पसंद करता हूं कि कमांड मुझसे चीजें नहीं पूछेंगे, ताकि वे स्क्रिप्ट करने योग्य हों। आप /etc/sudoersउस sudoपासवर्ड के बिना काम कर सकते हैं।

लेकिन ... क्यों नहीं जोड़ रहा

chgrp  one-of-your-groups-here /sys/class/backlight/acpi_video0/brightness     
chmod g+w /sys/class/backlight/acpi_video0/brightness 

तुम्हारे /etc/rc.localबारे में और भूल जाओ sudo?

(उबंटू में आप उपयोग कर सकते हैं अगर sudoआप में हैं sudo समूह है, तो आप उपयोग कर सकते हैं chgrp sudo /sys...और इसके साथ खुश हो।)


3

वैकल्पिक रूप से, आप जोड़ सकते हैं

Defaults        env_keep +="PATH"

आपकी /etc/sudoersफ़ाइल पर।


2

आप सूडो बैकलाइट को समायोजित करते हैं, क्योंकि ~ / बिन सूडो वातावरण में $ PATH में नहीं है

तो उस पर निर्भर क्यों? मुझे लगता है कि आपको बस उस लाइन को बदलना चाहिए /home/user/bin/backlight-adjustऔर यह काम करेगा।

लेकिन मैं वास्तव में एक उपनाम का उपयोग करने के Terdon के समाधान की तरह होगा। या आप अपनी स्क्रिप्ट को /usr/bin/इसमें रख सकते हैं और यह हर उपयोगकर्ता के लिए उपलब्ध होगा (incl। Root)


हां, लेकिन ऐसा करना कष्टप्रद है। अन्यथा, मेरे $ PATH में इसे पहले स्थान पर रखने का क्या मतलब था? इसके अलावा, मुझे यह पसंद है ~/binक्योंकि तब यह मेरे घर के डॉटफाइल्स रिपॉजिटरी के अधीन है, इसलिए यह संस्करण-नियंत्रण में रहता है।
जॉन फेमिनेला

वैसे @JohnFeminella, वहाँ परिवर्तन पथ के लिए कोई कारण नहीं है, बस का उपयोग -Eझंडा पर्यावरण के संरक्षण के लिए:sudo -E command
terdon

@terdon जो डेबियन में काम नहीं करता है; यह सुरक्षा कारणों से ओवरराइड है। जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, आपको पर्यावरण चर को स्पष्ट रूप से पारित करना होगा sudo env "PATH=$PATH" ...
जॉन फेमिनाला

1

एक सामान्य नियम नहीं दे सकता है ... यदि स्क्रिप्ट / प्रोग्राम को कुछ पुन: संयोजन (जैसे एक प्रिंटर) करने के लिए डिज़ाइन किया गया है और नियमित उपयोगकर्ताओं द्वारा कॉल किया जाता है, तो इसे करना होगा। अन्यथा, मैं अकेले बहुत अच्छा छोड़ देता हूं: यदि एक नियमित उपयोगकर्ता इसे चलाता है, तो बस विफल हो जाता है (या तो एक स्पष्ट जांच के परिणामस्वरूप, या सिर्फ इसलिए कि इसे कुछ करने की अनुमति नहीं है)।

एलिवेटेड विशेषाधिकारों को संयमपूर्वक सौंपा जाना चाहिए, यदि सभी पर। उच्च विशेषाधिकार पर स्विच करना मुश्किल है, इसे विशेषज्ञों (यानी, sudo(1)) पर छोड़ दें ।


0

मैं व्यक्तिगत रूप ${SUDO}से अपनी स्क्रिप्ट में कुछ का उपयोग करता हूं, ताकि कॉल करने वाला इसे ज़रूरत पड़ने पर सेट कर ${SUDO:-sudo}सके या डिफ़ॉल्ट रूप से उपयोग कर सके।

आपके विशिष्ट मामले में, मैं स्वीकृत उत्तर के साथ हूं, हालांकि।


-1

स्क्रिप्ट को (बिना sudo) उचित उपयोगकर्ता-विस्तृत स्थान पर रखें, जैसे /bin, और फिर ऐसा करें:

sudo chown root /bin/backlight-adjust
sudo chmod 4755 /bin/backlight-adjust

यह सेट्यूड फ्लैग सेट करके काम करता है, जिसका अर्थ है कि इसे हमेशा फ़ाइल के मालिक के रूप में चलाया जाएगा। जानकारी के लिए कृपया http://major.io/2007/02/13/chmod-and-the-mysterious-first-octet/ पढ़ें । मैं वास्तव में यह सब कुछ नहीं जानता कि यह कैसे काम करता है, मैंने अभी-अभी यह पाया कि कुछ साल पहले मैंने जो कुछ पढ़ा था, उसके आधार पर मैंने इसे जाना।


1
शेल स्क्रिप्ट किसी भी अधिक सेट नहीं की जा सकती, धन्यवाद अच्छाई ... यह पूरी तरह से गलत जवाब है, आप जानते हैं। सुरक्षा-वार, विशेष रूप से।
मिराबिलोस

@mirabilos यह केवल खतरनाक है अगर समूह या सामान्य लेखन ध्वज हैं। सेतु के साथ जोखिम यह है कि फ़ाइल के लिए लिखने की अनुमति वाले कोई भी व्यक्ति उपयोगकर्ता की तरह कुछ भी चला सकता है, और इसलिए यह इन लेखन अनुमतियाँ हैं जिन्हें संरक्षित करने की आवश्यकता है। 4755हमेशा मालिक के रूप में निष्पादित, मालिक पढ़ सकते हैं, लिख सकते हैं और निष्पादित कर सकते हैं, समूह पढ़ सकते हैं और निष्पादित कर सकते हैं, और उपयोगकर्ता पढ़ सकते हैं और निष्पादित कर सकते हैं, जो किसी भी उपयोगकर्ता को रूट अनुमतियों के साथ करने की अनुमति दी जानी चाहिए के लिए मानक अनुमति स्तर है।
AJMansfield

@mirabilos और यह विचार कि सेतु के साथ शैल लिपियों से द्विपदीय की तुलना में अधिक कमजोरियों का परिचय होता है, बस मूर्खतापूर्ण है; बायनेरिज़ या तो ptrace शोषण के लिए प्रतिरक्षा नहीं है, जो कि मुख्य फायदा है जो सेतु का फायदा उठाता है।
AJMansfield

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