सूडोइंग से पहले सुडो की क्षमता जांचना संभव है?


11

मैं एक छोटा सा यूटिलिटी प्रोग्राम लिख रहा हूं। sudoअगर यह आवश्यक हो तो कुछ करने का प्रयास करना चाहता हूं ।

वह यह है: यदि फ़ाइल अनुमतियां वर्तमान उपयोगकर्ता को किसी विशेष फ़ाइल पर काम करने की अनुमति नहीं देती हैं (और sudoनियम इसकी अनुमति देगा) तो मैं अपनी उपयोगिता को sudoफ़ाइल के स्वामी के रूप में कुछ करना चाहूंगा।

मैं पहले से ही इस क्षमता की जांच करने की उम्मीद कर रहा हूं, क्योंकि मैं पसंद करूंगा कि सिस्टम लॉग विफल sudoप्रयासों से शोर से भर न जाए । जैसा कि sudoअसफलता पर रिपोर्ट करता है: "इस घटना की सूचना दी जाएगी"।

इसलिए, मैं प्रोग्रामिक रूप से जाँच करने की उम्मीद कर रहा हूँ: के माध्यम से चला सकते user <x>हैं ?command <y>sudo

यहाँ समस्या है: जबकि /etc/sudoersउस मानचित्रण में यह रूट-स्वामित्व है और नियमित उपयोगकर्ताओं द्वारा पठनीय नहीं है।

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

क्या sudo -lआउटपुट के प्रोग्रामेटिक पार्सिंग को सुरक्षित माना जाता है? यदि नहीं, तो समय से पहले यह निर्धारित करने के लिए कोई बेहतर विकल्प हैं कि क्या एक सुडो कमांड सफल होगा?


(एक्स / वाई पर पृष्ठभूमि: यह उपयोगिता सीमित पहुंच वाले भूमिका खाते द्वारा उपयोग के लिए है। मुझे उम्मीद है कि कुछ अन्य उपयोगकर्ता भी सीमित पहुंच वाले खाते को सुडो नियमों के माध्यम से अपनी फाइलों पर संचालित करने की अनुमति देने के लिए प्रभावी रूप से विकल्प चुन सकते हैं। हालांकि, मैं जीत गया। 'समय से पहले पता करें कि उन अन्य उपयोगकर्ताओं में से कौन सा प्रासंगिक नियम नियम है)


3
मेरा सुझाव है कि आप थोड़ा अलग तरीका अपनाएं। प्रति-उपयोगकर्ता नियम रखने के बजाय, ऐसा कोई समूह क्यों नहीं है, जिसे वह करने की अनुमति है, जो भी आप करना चाहते हैं। इस तरह, आप बस यह देख सकते हैं कि उपयोगकर्ता समूह में है या नहीं। क्या यह एक अच्छा विकल्प होगा?
terdon

जवाबों:


13

सुडो मैन पेज के अनुसार:

 -l, --list  If no command is specified, list the allowed (and forbidden)
             commands for the invoking user (or the user specified by the
             -U option) on the current host.  A longer list format is used
             if this option is specified multiple times and the security
             policy supports a verbose output format.

             If a command is specified and is permitted by the security
             policy, the fully-qualified path to the command is displayed
             along with any command line arguments.  If command is
             specified but not allowed, sudo will exit with a status value
             of 1.

तो यह करने के लिए उबाल जाएगा

if sudo -l -U $USER shutdown > /dev/null
then
   ## $USER can
else
   ## $USER cannot
fi 

के रूप में Muru, उपयोग या तो द्वारा बताया -U $USERया -U $USERTOTESTया कुछ भी नहीं, अपनी जरूरत पर निर्भर करता है।


यदि आप $USERवर्तमान उपयोगकर्ता का मतलब चाहते हैं, तो आप sudo -l <command>बिना कर सकते हैं -U $USER
मुरु

धन्यवाद - यह उपयोगी है। इस दृष्टिकोण के परीक्षण में मैंने एक बात नोटिस की है कि यह उन मामलों की देखभाल करने के लिए प्रतीत नहीं होता है जहाँ सभी अपवादों के साथ विशेष आज्ञाओं को अनुमति देने के लिए sudo नियम स्थापित किया गया है, जैसे कि (targetUser) ALL, !/usr/bin/foo .. उस मामले में sudo -l -u targetUser /usr/bin/fooअभी भी आउटपुट /usr/bin/fooऔर निकास के लिए प्रकट होता है स्थिति 0. के साथ, फिर भी, यह मूल रूप से मेरे साधारण चेक के लिए पर्याप्त है, और अधिक वर्बोज़ sudo -lआउटपुट को पार्स करता है ।
पीटर मार्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.