उपयोगकर्ता को तर्कों के साथ एक कमांड चलाने की अनुमति दें (जिसमें स्थान शामिल हैं)


17

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

हालाँकि यह काम नहीं करता है, sudo पासवर्ड मांगता रहता है।

मेरी आज्ञा है: sudo grep "string I want (" /var/log/thefilename.log(हाँ, एक कच्चा है( स्ट्रिंग में और कुछ रिक्त स्थान है जो मुझे चाहिए)

/etc/sudoers.d/user-can-grep यह सामग्री है:

user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log

इस sudoers फ़ाइल के स्वामित्व में है root:root और इसकी अनुमति है-r--r-----

सर्वर Ubuntu भरोसेमंद 14.04.3 LTS है।

मै इसे काम मे कैसे ले सकता हूँ?


क्या नगियोस की जाँच स्पष्ट रूप से / बिन / grep, या / usr / bin / grep बुला रही है?
जेफ स्कालर

एक शेल स्क्रिप्ट लिखें जो ऐसा करता है, और फिर स्क्रिप्ट को चलाने दें sudo
user253751

@JeffSchaller FYI करें स्क्रिप्ट सिर्फ कॉल करती है grep, और which grepमुझे बताती है कि यह उपयोग कर रहा है /bin/grep। AFAIK sudo फ़ाइल में आपको बाइनरी के पूर्ण पथ को निर्दिष्ट करने की आवश्यकता है, भले ही आप इसे पूर्ण पथ के बिना कहें।
रॉरी

जवाबों:


13

जाहिर है, sudoers फ़ाइल में विनिर्देश की तुलना करने से पहले sudo कमांड को एक स्ट्रिंग में समतल कर देता है। इसलिए, आपके मामले में, आपको उद्धरण या भागने के किसी अन्य रूप का उपयोग करने की आवश्यकता नहीं है:

user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log

संपादित करें : जैसा कि @ user23013 टिप्पणियों में बताते हैं, यह किसी भी फ़ाइल में "स्ट्रिंग I वांट" के लिए grep के लिए शोषण किया जा सकता है (और, विस्तार से, "string I" और "string" के लिए भी।) कृपया पहले सावधानीपूर्वक विचार करें। सूडो की तर्क जाँच का उपयोग करना!


यह भी ध्यान दें कि निम्नलिखित इनवोकेशन समतुल्य हैं, यानी आप उपयोगकर्ताओं को एक विशिष्ट प्रतिनिधित्व तक सीमित नहीं कर पाएंगे:

sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log

यह इस तथ्य के कारण है कि उद्धरण और भागने शेल द्वारा नियंत्रित किया जाता है और कभी नहीं पहुंचता है sudo


दिलचस्प है, मुझे आश्चर्य है कि अगर यह शोषक है, यानी sudoआपको एक बात टाइप की जाती है (जो विनिर्देशन से मेल खाती है) लेकिन जब इसे निष्पादित करने की बात आती है, तो यह पूरी तरह से कुछ और है।
एइटबिटोनी 11

4
@EightBit यह निश्चित रूप से है! आपके में sudoers: user host = NOPASSWD: /usr/bin/vim Editing sudoers file(उपयोगकर्ताओं को "एडिटिंग सूडर्स फाइल" को संपादित करने के इरादे से) cd'आईएनजी इन /etc/एंड रन ' द्वारा शोषित किया जा सकता है sudo vim Editing sudoers file। मैं कहूंगा कि किसी भी उचित जटिलता के आदेश के लिए आपकी टिप्पणी में सुझाए गए दृष्टिकोण के साथ जाना चाहिए - शेल $@चर प्रदान करता है जहां आप जांच सकते हैं कि तर्क जिस तरह से आप उन्हें समूहीकृत किए जाने की उम्मीद करते हैं, उन्हें वर्गीकृत किया गया है।
अलेक्जेंडर बातिशेव

8
( /var/logकहीं भी एक पथ बनाएं और thefilename.logकिसी भी फ़ाइल के लिए सिमिलिंक करें, उपयोगकर्ता string I wantतब किसी भी फ़ाइल से grep कर सकता है ।
user23013

2
@ EBBitTony का उत्तर (एक रैपर स्क्रिप्ट लिखें, सूडो को उस स्क्रिप्ट तक पहुंचने की अनुमति दें) बहुत बेहतर और सुरक्षित है।
कास

वाह, यह एक सुरक्षा-केंद्रित उपकरण के लिए बेहद खराब अभ्यास है।
सैम वाटकिंस

32
  1. एक स्क्रिप्ट लिखें (केवल जड़ से लिखने योग्य)
  2. उस स्क्रिप्ट में, grepआपको आवश्यक निष्पादित करें
  3. Sudoers config में, केवल उस स्क्रिप्ट तक पहुँच की अनुमति दें
  4. जो भी उपकरण कॉन्फ़िगर करें या जो भी उपयोगकर्ता को सलाह दें कि वह सूडो के माध्यम से स्क्रिप्ट चलाएं

डिबग करने के लिए बहुत आसान है, एक विशिष्ट फ़ाइल के लिए विशिष्ट पहुँच को लॉक करना आसान है, और शोषण करने के लिए बहुत कठिन है।


2

चूँकि आपको केवल फ़ाइल एक्सेस के लिए रूट की आवश्यकता होती है, उपयोग करने पर विचार करें cat, teeया कुछ समान और पाइपिंग करें grepया जो भी प्रोग्राम आपको चलाने की आवश्यकता है। उदा। sudo cat /file/path | grep …इस तरह से आप रूट को उस जगह तक सीमित कर देते हैं जहाँ आपको इसकी आवश्यकता है।


0

sudoमहान है, लेकिन कभी-कभी यह सबसे अच्छा फिट नहीं है। इसके लिए मुझे इस्तेमाल करना अच्छा लगता है supersuperउच्चीकृत अनुमतियों की भी अनुमति देता है, हालांकि यह कमांड उपनामों को मानता है, जो जटिल कमांड लाइनों की अनुमति देते समय सुविधाजनक है, क्योंकि वे सरल कमांड लाइनों के रूप में उपयोग किए जाते हैं।

आपका super.tab ऐसा दिखेगा:

grepcmd "grep 'string I want (' /var/log/thefilename.log" user

और के रूप में लागू किया जाएगा super grepcmd


sudoहै Cmnd_Alias(जिसमें एक या अधिक आदेश हो सकते हैं, आर्ग प्रतिबंध के साथ या बिना)।
कास

बिलकुल एक ही बात नहीं। Cmnd_Alias ​​कॉन्फ़िगरेशन फ़ाइल को सरल बनाने के लिए एक उपकरण है, यह उपयोगकर्ता के लिए एक उपनाम नहीं बताता है जो ऑपरेशन का सुपर प्राथमिक मोड है (यही कारण है कि मैं सूडो का उपयोग करता हूं जब मैं या तो अलियासिंग कमांड या रनिंग स्क्रिप्ट नहीं कर रहा हूं) (अधिकांश समय) , और इन दो उपयोग मामलों के लिए सुपर)।
हिल्ड्रेड

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