निम्नलिखित उस मामले के लिए है, जहां आप पासवर्ड के बिना एक कमांड चलाना चाहते हैं, यदि उसके पास विकल्पों का एक विशिष्ट सेट है, जहां विकल्पों का एक हिस्सा परिवर्तनशील है । AFAIK sudoers घोषणाओं में चर या मान पर्वतमाला का उपयोग करना संभव नहीं है, अर्थात आप स्पष्ट रूप से पहुंच की अनुमति दे सकते हैं command option1
लेकिन इसके लिए नहीं command option2
:
user_name ALL=(root) /usr/bin/command option1
लेकिन अगर संरचना है command option1 value1
, जहां value1
भिन्न हो सकते हैं, तो आपको प्रत्येक संभावित मूल्य के लिए स्पष्ट sudoers लाइनों की आवश्यकता होगी value1
। शेल स्क्रिप्ट इसके चारों ओर एक रास्ता प्रदान करती है।
यह उत्तर एम। अहमद ज़फ़र के जवाब से प्रेरित था और वहाँ सुरक्षा के मुद्दे को ठीक करता है।
- एक शेल स्क्रिप्ट बनाएं जहां आप बिना कमांड के कॉल करें
sudo
।
- रूट-विशेषाधिकार प्राप्त फ़ोल्डर (जैसे
/usr/local/bin/
) में स्क्रिप्ट को सहेजें , फ़ाइल रूट-स्वामित्व (जैसे chown root:wheel /usr/local/bin/script_name
) दूसरों के लिए कोई लेखन पहुंच (जैसे ) के साथ बनाएं chmod 755 /usr/local/bin/script_name
।
दृश्यदर्शी का उपयोग कर sudoers के लिए अपवाद जोड़ें:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
।
अपनी स्क्रिप्ट चलाएँ sudo script_name
।
उदाहरण के लिए, मैं macOS पर डिस्प्ले स्लीप टाइमआउट बदलना चाहता हूं। यह प्रयोग किया जाता है:
sudo pmset displaysleep time_in_minutes
मैं नींद के समय को एक निर्दोष कार्रवाई को बदलने पर विचार करता हूं जो पासवर्ड टाइपिंग की परेशानी को सही नहीं ठहराता है, लेकिन pmset
कई चीजें कर सकता है और मैं सूडो पासवर्ड के पीछे इन अन्य चीजों को रखना चाहूंगा।
इसलिए मेरे पास निम्नलिखित स्क्रिप्ट है /usr/local/bin/ds
:
#!/bin/bash
if [ $# -eq 0 ]; then
echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
pmset displaysleep $1
else
echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
fi
fi
sudoers
फ़ाइल के अंत में मेरे पास निम्न पंक्ति है:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
3 मिनट में टाइमआउट सेट करने के लिए, मैं अपनी स्क्रिप्ट को साधारण उपयोगकर्ता खाते से चलाता हूं user_name
:
sudo ds 3
PS मेरी स्क्रिप्ट का अधिकांश भाग इनपुट सत्यापन है, जो अनिवार्य नहीं है, इसलिए निम्नलिखित भी काम करेगा:
#!/bin/bash
pmset displaysleep $1
/path/to/my/program
एक अजगर स्क्रिप्ट थी?