अगर "सच" का उद्देश्य बैश में है "अगर सूडो सच है; फिर"


20

मैंने इस बैश स्क्रिप्ट को एक साथ हैक किया है जो यह परीक्षण करता है कि उपयोगकर्ता के पास सुपरसुसर विशेषाधिकार हैं और यदि वे इसे नहीं मांगते हैं। अंततः मैं दूसरे 'अगर' कथन को उलटने की कोशिश कर रहा हूं ताकि मैं निम्नलिखित दो पंक्तियों को हटा सकूं (गूंज "पासवर्ड ठीक है" और निम्नलिखित पंक्ति पर अन्य)

# Root user only
if [[ "$EUID" != 0 ]]; then
    sudo -k # make sure to ask for password on next sudo
    if sudo true; then
        echo "Password ok"
    else
        echo "Aborting script"
        exit 1
    fi
fi

echo "do my ops"

क्या चौथी पंक्ति पर "सत्य" का उद्देश्य केवल एक अशक्त कथन है?

मुझे चौथी पंक्ति पर परीक्षण को पलटना चाहिए, मैं ऐसा कैसे करूं? यहाँ मैं कोशिश की है:

if sudo false; then  
if sudo true == false; then
if [!(sudo true)]; then

2
यदि आप प्रश्न को कम करने जा रहे हैं, तो कृपया बताएं कि प्रश्न को बेहतर बनाने के लिए मैं क्या कर सकता हूं? क्या यह सही ओवरफ्लो साइट नहीं है?
मैट पार्किन्स

4
निश्चित नहीं है कि नीचे की ओर कहां से आ रहे हैं; आप की कोशिश कर रहे नकारना बयान या रद्द बयान? आप कहते हैं कि आप सच / गूंज और "दोनों" से छुटकारा चाहते हैं, तो आपका अंतिम उद्देश्य क्या है?
जेफ स्कालर


1
@ ctrl-alt-delor उस लिंक का अनुसरण करते हुए, ऐसा लगता है कि मुझे बस जरूरत है कि सुडोलो के सामने एक विस्मयादिबोधक चिह्न लगाया जाए और फिर मैं इको और बाकी दोनों को हटा सकता हूं और अब मैंने इसका परीक्षण किया है, यह काम करता है, धन्यवाद।
मैट पार्किन्स

2
गुजरने में, आपको शायद त्रुटि संदेश को त्रुटि स्ट्रीम पर पुनर्निर्देशित करना चाहिए:echo "Aborting script" >&2
टोबी स्पाइट

जवाबों:


38

truebash में कोई कीवर्ड नहीं है, यह एक प्रोग्राम है जो तुरंत एक सफल निकास कोड के साथ बाहर निकलता है। इसी तरह, falseएक प्रोग्राम है जो एक असफल निकास कोड के साथ बाहर निकलता है।

आप अपने टर्मिनल से दोनों प्रोग्रामों को चलाकर और फिर $?चर को पढ़कर , जिसमें अंतिम प्रोग्राम का निकास कोड शामिल है, इसे आज़मा सकते हैं ;

true
echo $? # 0
false
echo $? #1

if sudo trueके बराबर नहीं है if sudo == true। प्रोग्राम का उपयोग कर if sudo trueचला रहा है , और निकास कोड की जाँच कर रहा है।truesudo

इसलिए:

if sudo false; thenfalseसूडो के रूप में कार्यक्रम चला रहा है । वापसी हमेशा झूठी होगी।

if sudo true == falsetrueतर्क ==और falseउपयोग के साथ कार्यक्रम चलाएंगे sudo। यह स्पष्ट रूप से आप का इरादा नहीं है।

if [!(sudo true)] अमान्य सिंटैक्स है।

आप जो खोज रहे हैं वह शायद है

if ! sudo true;

12
पहले वाक्य में थोड़ा पांडित्यपूर्ण सुधार के रूप में : बैश में , trueऔर false"बिलिंस" हैं, कमांड सीधे शेल द्वारा व्याख्या की जाती हैं; सामान्य रूप से यूनिक्स जैसी प्रणालियों में , वे फ़ाइल सिस्टम पर स्टैंडअलोन प्रोग्राम के रूप में भी मौजूद हैं। यह अंतर इतना मायने नहीं रखता है, लेकिन जहाँ तक मुझे पता है, sudo trueस्टैंडअलोन प्रोग्राम को चलाया जाएगा, बैश बिलिन को नहीं।
IMSoP

31
पुनश्च: मेरे पसंदीदा सारांश trueऔर falseउनके मैन पेज पर शीर्षक हैं: true - do nothing, successfullyऔरfalse - do nothing, unsuccessfully
IMSoP

3
@IMSoP यह गहरा है।
ब्रेनप्लॉट

2
यदि trueमौजूद नहीं था, तो प्रश्न में कोड दिखाता है कि किसी को इसे आविष्कार करने की आवश्यकता क्यों हो सकती है! यह एक न्यूनतम कार्यक्रम है जो केवल तभी विफल हो सकता है जब सिस्टम जिस पर है वह वास्तव में बोर हो। यदि किसी की पहुंच क्रेडेंशियल ठीक है, तो यह स्थापित करने के लिए इसका उपयोग कर सकते हैं।
nigel222

2
एटी एंड टी एसवाईएसवी यूनिक्स में, "सच" एक शेल स्क्रिप्ट / बिन / सच था, जिसमें टिप्पणियों में एक बड़ा कॉपीराइट नोटिस शामिल था ... और कुछ नहीं।
ली डैनियल क्रॉकर

21

मुझे ऐसा लगता है कि स्वीकृत उत्तर वास्तव में आपके प्रश्न का उत्तर नहीं था?

ऐसा करने का उद्देश्य यह है कि आप वास्तव में जांच कर सकें sudo

इस चेक को कैसे किया जाता है यह trueकार्यक्रम के माध्यम से स्वीकार किए गए उत्तर में बताया गया है।


1
अनिवार्य रूप से, यह। वैकल्पिक यह जांचने के लिए हो सकता है कि उपयोगकर्ता sudoers समूह में है, लेकिन बस चलाना sudo trueभी एक तरह से आसान है, हालाँकि थोड़ा हैकी।
सर्गी कोलोडियाज़नी

3
ध्यान दें कि इसे भी sudoस्थापित करने की आवश्यकता है, इसलिए चेक पूरी तरह से समतुल्य नहीं होंगे ... आप sudoers समूह में हो सकते हैं और फिर भी sudo करने में सक्षम नहीं होंगे। (यह विशेष रूप से ऊपर आ सकता है यदि आप उदाहरण के लिए एक स्क्रिप्ट लिख रहे हैं ताकि एक नई छवि को एक न्यूनतम रूटफ़ॉर्क्स टारबॉल से सेट किया जा सके, जिसमें सूडो हो सकता है।)
मेहरदाद

1
यदि आप सुडोल नहीं कर सकते हैं, तो ओपी बाहर छोड़ना चाहता है, और दो लाइनों से छुटकारा पा सकता है बजाय इसके कि वह एक नूप का अनुसरण करे।
मैकेन्ज़्म

2
और, इसके विपरीत, आप sudoसूडोर्स समूह में होने के बिना भी सक्षम हो सकते हैं यदि आप (या तो व्यक्तिगत रूप से या किसी अन्य समूह के सदस्य के रूप में ) सूचीबद्ध हैं /etc/sudoers। लेकिन यहां तक sudo trueकि अचूक नहीं है, क्योंकि sudoपहुंच केवल विशिष्ट आदेशों के लिए दी जा सकती है, इसलिए आप इसके लिए सक्षम हो सकते हैं sudo true, लेकिन sudo something_elseइसके विपरीत या इसके विपरीत नहीं। वास्तव में जिस कमांड के साथ आप चलना चाहते हैं, उसे चलाने की कोशिश करने के अलावा अन्य परीक्षण करने के लिए कोई आयरन-क्लैड तरीका नहीं है sudo
डेव शेरोमैन

2
इसके अलावा, आप sudoersसमूह में हो सकते हैं और सक्षम नहीं हो सकते sudoक्योंकि sudoersसमूह sudoersफ़ाइल में सूचीबद्ध नहीं है । sudoइसके नाम के चार अक्षरों वाला एक समूह इस बात का वैध संकेत नहीं है कि उस समूह का कोई उपयोगकर्ता किसी विशेष चीज या किसी भी चीज का उपयोग कर सकता है या नहीं sudo
jrw32982

5

जैसा कि मैं इस स्क्रिप्ट में देख रहा हूं। यह सिर्फ जाँच कर रहा है कि क्या सूडो सक्षम है, कि यह है ।।

सच सिर्फ सच लौटाता है।

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

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

अन्य कमांडों को sudo पासवर्ड पूछने की आवश्यकता नहीं है, क्योंकि आपका प्रमाणीकरण पहली बार में ही है (लेकिन यह sudo कॉन्फ़िगरेशन पर निर्भर करता है, इसलिए यह स्क्रिप्ट वातावरण कॉन्फ़िगरेशन में बहुत निर्भर करता है)

'इको पासवर्ड ओके' भी यही प्रदर्शित करता है। शेल स्क्रिप्ट अब पासवर्ड नहीं पूछेगा।


1
केवल कमांड जो सूडो के माध्यम से चलते हैं, वे हैं sudo trueऔर sudo -k। उत्तरार्द्ध स्पष्ट रूप से एक पासवर्ड की आवश्यकता नहीं है। सूडो के माध्यम से चलने वाली स्क्रिप्ट में कोई भी अन्य कमांड नहीं है, इसलिए निश्चित रूप से उन्हें पासवर्ड की आवश्यकता नहीं होगी, भले ही प्रमाणीकरण पहली बार सफल हो।
इलकाचू

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