अगर मैं sudo एक बैश स्क्रिप्ट फ़ाइल निष्पादित करता हूं, तो क्या Bash स्क्रिप्ट के अंदर सभी कमांड को sudo के रूप में भी निष्पादित किया जाएगा?


30

मैं बाश ( post-install.shउदाहरण के लिए,) में एक स्वचालित पोस्ट-इंस्टॉलेशन स्क्रिप्ट लिखना चाहता हूं । स्क्रिप्ट स्वचालित रूप से रिपॉजिटरी जोड़ और अद्यतन करेगी, पैकेजों को स्थापित और अपडेट करेगी, कॉन्फ़िगर फ़ाइलों को संपादित करेगी, आदि।

अब, अगर मैं इस स्क्रिप्ट को निष्पादित करता हूं, उदाहरण के लिए sudo post-install.sh, क्या मुझे केवल एक sudoबार पासवर्ड के लिए संकेत दिया जाएगा, या क्या मुझे sudoस्क्रिप्ट के अंदर एक कमांड के प्रत्येक आह्वान पर पासवर्ड दर्ज करने की आवश्यकता होगी , जिसे sudoअनुमति की आवश्यकता है? दूसरे शब्दों में, बाश स्क्रिप्ट के अंदर कमांड्स निष्पादन की अनुमतियों को 'इनहेरिट' करती हैं, इसलिए बोलने के लिए?

और, यदि वे वास्तव में करते हैं , तो क्या अभी भी एक संभावना है कि sudoअनुमतियाँ समाप्त हो जाएंगी (यदि, उदाहरण के लिए, किसी विशेष कमांड को sudoटाइमआउट से अधिक समय लगता है)? या प्रारंभिक sudoपासवर्ड प्रवेश पूरी स्क्रिप्ट की पूरी अवधि तक रहेगा?


4
आपको इस कार्य के लिए विशेष रूप से डिज़ाइन किए गए कुछ टूल की जांच करने में रुचि हो सकती है। 3 आम हैं: कठपुतली, रसोइया और चेतन।
स्पूडर

@spuder, और बड़े पैमाने पर, एंटरप्राइज़-स्तरीय आर्किटेक्चर और आपके कॉन्फ़िगरेशन प्रबंधन की सुरक्षा के लिए, आप CFEngine 3 का उपयोग कर सकते हैं। (दिल की बेहोशी के लिए नहीं, और न ही एक बार के आदेश के लिए।)
Wildcard

जवाबों:


38

Q # 1: क्या मुझे केवल एक बार एक sudo पासवर्ड के लिए संकेत दिया जाएगा, या क्या मुझे स्क्रिप्ट के अंदर एक कमांड के प्रत्येक आह्वान पर sudo पासवर्ड दर्ज करने की आवश्यकता होगी, जिसे sudo अनुमति की आवश्यकता है?

हां, एक बार, अपनी स्क्रिप्ट के चलने की अवधि के लिए।

नोट: जब आप क्रेडेंशियल प्रदान करते हैं sudo, तो प्रमाणीकरण आमतौर पर उस शेल के भीतर 5 मिनट के लिए अच्छा होता है जहां आपने पासवर्ड टाइप किया था। इसके अतिरिक्त किसी भी बच्चे की प्रक्रिया जो इस शेल से निष्पादित होती है, या शेल में चलने वाली कोई भी स्क्रिप्ट (आपका मामला) भी ऊंचे स्तर पर चलेगी।

क्यू # 2: क्या अभी भी एक संभावना है कि सूडो की अनुमति समय समाप्त हो जाएगी (यदि, उदाहरण के लिए, एक विशेष कमांड सुडो समय से अधिक समय लेता है)? या प्रारंभिक स्क्रिप्ट का प्रवेश द्वार पूरी स्क्रिप्ट की पूरी अवधि तक रहेगा?

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

सुडोल आदमी पृष्ठ से अंश

यह सीमा नीति-विशिष्ट है; डिफ़ॉल्ट पासवर्ड संकेत समय sudoers सुरक्षा नीति के लिए 5 मिनट है।


1
Q1 का उत्तर है "नहीं, आपको फिर से संकेत नहीं दिया जाएगा।"
dannysauer

@dannysauer - उसका क्यू फिर से पढ़ें। मैं कह रहा हूँ हाँ केवल एक बार पासवर्ड के लिए कहा जा रहा है!
स्लम

सवाल कहता है कि "यह एक या बी" है, और सिर्फ "हां" कहने से यह स्पष्ट नहीं हुआ कि क्या यह "हां," या "हां, बी" है। बस भविष्य के पाठकों के लिए चीजों को स्पष्ट करने की कोशिश कर रहा है। : D
dannysauer

@dannysauer - अपडेट देखें।
स्लम

1
यह नया प्रश्न यह होगा: stackoverflow.com/questions/3522341/…sudo -u $(logname) <command>कार्य करना चाहिए।
गौथियर

17

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

sudoटाइमआउट केवल (बाद में) के अलग मंगलाचरण पर लागू होता है sudo। यह आपकी पहले से चल रही बैश प्रक्रिया या इसके किसी वंशज को प्रभावित नहीं करेगा।


3

ये उत्तर शायद सभी सही हैं। हालाँकि, यह आमतौर पर इस्तेमाल किया जाने वाला तरीका (जहाँ तक मुझे पता है) बैश स्क्रिप्ट बनाने के लिए sudoअनुमति की आवश्यकता होती है। आम तौर पर, स्क्रिप्ट के शीर्ष पर आप यह मान लेते हैं कि यह sudoअनुमतियों के साथ नहीं चलाया गया है और इसके बजाय sudo -vअपने आप को कॉल करें (जो कि उपयोगकर्ता को उनके पासवर्ड के लिए संकेत देगा) एक sudo'सत्र' स्थापित करने के लिए। आप या तो echoप्रॉम्प्ट से पहले कुछ व्याख्यात्मक पाठ कर सकते हैं , या स्विच के sudoसाथ स्वयं के प्रॉम्प्ट को ओवरराइड कर सकते हैं -p, ताकि उपयोगकर्ता को यह पता चल sudoसके कि आपको कुछ कमांड के लिए एक्सेस की आवश्यकता है ।

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

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


1
यह कहें कि स्क्रिप्ट का एक चरण पूरी तरह से एक नया लिनक्स कर्नेल बना रहा है, जिसमें दो घंटे लग सकते हैं। सत्र को जीवित रखना एक चुनौती हो सकती है, आप इससे कैसे निपटेंगे?
गौथियर

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

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

मुझे लगता है कि मुझे स्पष्ट करना चाहिए, ऐसा करने का एक और तरीका स्क्रिप्ट की शुरुआत में एक बार सुडो को कॉल करना होगा ताकि यह सुनिश्चित करने के लिए कि फ़ाइल को कॉपी करने से पहले एक मान्य फ़ाइल का /etc/sudoers.dउपयोग किया visudo -c -f /tmp/tempsudoersजा सके, और फिर उस फ़ाइल को एक बार हटाने के बाद (एस्केलेशन का दुरुपयोग न हो सके, यह सुनिश्चित करने के लिए निकास / त्रुटि पर एक जाल का उपयोग करना)। सबसे सुरक्षित और सुरक्षित कार्यान्वयन केवल आपके उपयोगकर्ता को NOPASSWDफ़ाइल बनाने के लिए एक सरणी में प्रत्येक आदेश / तर्कों का उपयोग करके पासवर्ड के बिना विशिष्ट तर्कों के साथ आपकी स्क्रिप्ट में विशिष्ट कमांड चलाने की अनुमति देगा ।
ड्रैगन 788

थोड़ा देर से यहाँ @Gauthier पर वापस आ रहा हूँ, लेकिन यह प्रतीत होता है कि मैं गलत था जब मैंने कहा कि आप एक sudoसत्र को जीवित नहीं रख सकते हैं यदि एक दिया गया कार्य समय से अधिक समय लेता है। मैं इस तकनीक के दूसरे दिन मैथियास ब्यनेंस के डॉटफाइल्स रेपो में आया: while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13
एलेक्स्रससेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.