मैं एक स्क्रिप्ट से / etc / sudoers कैसे संपादित / कर सकता हूँ?


116

मुझे /etc/sudoersसफेद सूचियों से सामान जोड़ने / हटाने के लिए स्क्रिप्ट से संपादित करने की आवश्यकता है ।

यह मानते हुए कि मेरे पास एक कमांड है जो एक सामान्य फ़ाइल पर काम करेगी, मैं इसे कैसे लागू कर सकता हूं /etc/sudoers?

क्या मैं इसे कॉपी और संशोधित कर सकता हूं, फिर visudoमूल को संशोधित प्रति के साथ बदल दिया है? में अपनी खुद की स्क्रिप्ट प्रदान करके $EDITOR?

या मैं सिर्फ एक ही ताले का उपयोग कर सकता हूं और cp?

यह सवाल संभावित मुद्दों के बारे में अधिक है कि केवल कुछ खोजने के बारे में काम करता है।

जवाबों:


146

पुराना धागा, लेकिन इसके बारे में क्या:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo

10
यह एक बेहतरीन जवाब है। पूरे उपधारा को रूट के रूप में निष्पादित किया जाना चाहिए, जैसे echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync')
सिमोन

3
यह जवाब बहुत अच्छा काम करता है! मैं इसे डेबियन पैकेजों में पोस्टस्टैंड स्क्रीप्ट्स के लिए उपयोग करता हूं। धन्यवाद! चूँकि यह हमेशा जड़ होता है, यह छोटा और आसान हो जाता है:echo "$CONFIGLINE" | (EDITOR="tee -a" visudo)
बोरिस डैपेन

3
मैं केवल @ बोरिसडैपेन के उत्तर: -aफ्लैग टू EDITOR="tee": के लिए एक बड़ी बारीकियों को इंगित करना चाहता हूं : यह पहली पंक्ति को अधिलेखित करने के लिए न केवल फ़ाइल के लिए लाइन को जोड़ देगा। मैं पहली बार में अलग नहीं पकड़ पाया और मैं अपेंड करने के तरीके का पता नहीं लगा सका। मुझे आशा है कि मैं कुछ लोगों को सीधे इंगित करके कुछ समय पा सकता हूं ;-)
जीन-फिलिप मरे

3
क्या कोई मुझे समझा सकता है कि इस काम का मेरा मतलब यह है कि EDITOR = 'टी-ए' के ​​बाद आवश्यक अर्धविराम नहीं है। मुझे पता है कि वह कमांड तोड़ देगा। EDITOR एक शेल वैरिएबल है और विसूडो अभी तक एक और कमांड है इसलिए यहाँ हम EDITOR और विडो को एक ही कमांड लाइन में पास कर रहे हैं। यह कैसे काम करता है?
सागर

1
मैंने इस x = "कुछ" $ x को प्रतिध्वनित करने की कोशिश की। यह मेरे लिए काम नहीं किया।
सागर

43

एक कस्टम संपादक के साथ इसके लिए विज़ूडो का उपयोग करें। यह ब्रायन के समाधान के साथ सभी दौड़ की स्थितियों और "हैक" समस्याओं को हल करता है।

#!/bin/sh
if [ -z "$1" ]; then
  echo "Starting up visudo with this script as first parameter"
  export EDITOR=$0 && sudo -E visudo
else
  echo "Changing sudoers"
  echo "# Dummy change to sudoers" >> $1
fi

यह स्क्रिप्ट "" डमी चेंज टू सूडर्स "को सूडर्स के अंत तक जोड़ देगा। कोई हैक नहीं और कोई दौड़ की स्थिति नहीं।

एनोटेटेड संस्करण जो बताता है कि यह वास्तव में कैसे काम करता है:

if [ -z "$1" ]; then

  # When you run the script, you will run this block since $1 is empty.

  echo "Starting up visudo with this script as first parameter"

  # We first set this script as the EDITOR and then starts visudo.
  # Visudo will now start and use THIS SCRIPT as its editor
  export EDITOR=$0 && sudo -E visudo
else

  # When visudo starts this script, it will provide the name of the sudoers 
  # file as the first parameter and $1 will be non-empty. Because of that, 
  # visudo will run this block.

  echo "Changing sudoers"

  # We change the sudoers file and then exit  
  echo "# Dummy change to sudoers" >> $1
fi

5
इसके लिए यह आवश्यक है कि सुडो को संकलित किया गया है --enable-env-editor, अन्यथा यह केवल संपादक चर का सम्मान करेगा, यदि यह ज्ञात मानों के एक छोटे समूह में से एक है।
कालेब

यह मेरे लिए (Ubuntu 12.04) काम करता है, लेकिन मुझे समझ नहीं आता कि यह कैसे काम करता है। क्या कोई समझा सकता है कि इसका सही इस्तेमाल कैसे किया जाए और यह वास्तव में कैसे काम करता है? धन्यवाद
MountainX

कृपया ध्यान दें कि यह मेरे लिए 12.04 सटीक काम नहीं करता है। मैं एक bash स्क्रिप्ट बनाने के लिए, यह करने के लिए जोड़ा + x अनुमतियों और निम्न उत्पादन के साथ फ़ाइल निष्पादित: visudo: Exec प्रारूप त्रुटि visudo: / tmp / edit_sudoers चलाने में असमर्थ /etc/sudoers.tmp अपरिवर्तित
जोस डाएज गोंजालेज

इसने मेरे लिए बहुत अच्छा काम किया, हालांकि मैंने बस रूट के रूप में लॉग इन किया और sudo -Eपहले कमांड से हटा दिया ।
मर्लिन2011

मुझे वास्तव में यह उत्तर पसंद है, लेकिन यह मेरे लिए काम नहीं करता था। मुझे लगता है कि मेरा सुडो आवश्यक ध्वज के साथ संकलित नहीं किया गया था।
Mnebuerquo

30

आपको अपना संपादन एक अस्थायी फ़ाइल में करना चाहिए, फिर परिवर्तनों की वैधता की पुष्टि करने के लिए visudo -c -f sudoers.temp का उपयोग करें और फिर इसे / etc / sudoers के शीर्ष पर कॉपी करें

#!/bin/sh
if [ -f "/etc/sudoers.tmp" ]; then
    exit 1
fi
touch /etc/sudoers.tmp
edit_sudoers /tmp/sudoers.new
visudo -c -f /tmp/sudoers.new
if [ "$?" -eq "0" ]; then
    cp /tmp/sudoers.new /etc/sudoers
fi
rm /etc/sudoers.tmp

ऐसा लगता है कि आप sudoers.tmp को लॉक फ़ाइल के रूप में उपयोग कर रहे हैं, यह सुनिश्चित नहीं है कि परिवर्तन की पुष्टि कैसे मान्य है। क्या हमें यह सुनिश्चित करने के लिए विस्कोस की निकास स्थिति की जाँच नहीं करनी चाहिए कि क्या कोई त्रुटि नहीं है?
कनवर्टर

/etc/sudoers.tmp इंटरैक्टिव मोड में visudo द्वारा जाँच की गई ताला है। विस्कोस -c -f एक 1 लौटाता है अगर कोई त्रुटि थी, इसलिए रिटर्न कोड की जांच।
ब्रायन सी। लेन

मैं sudoers.tmp का उपयोग करने के बारे में चिंतित हूं, क्योंकि यह विज़ूडो के आंतरिक इंटरफ़ेस, यानी, एक हैक का उपयोग करने जैसा दिखता है। क्या यह मानक है, जिसका अर्थ है कि यह हमेशा sudoers.tmp होना चाहिए जो लॉक के रूप में उपयोग किया जाता है? या क्या उन्हें भविष्य में ऐसा करने की स्वतंत्रता है?
n-अलेक्जेंडर

2
परीक्षण / स्पर्श के बजाय लॉकफाइल का उपयोग करने की आवश्यकता है
n-अलेक्जेंडर

2
मैनपेज कहता है कि यह /tmp/sudoers.tmp का उपयोग करता है ताकि वर्तमान में यह मानक हो। निश्चित रूप से यह भविष्य में बदल सकता है। और हाँ, आप सही हैं कि एक दौड़ की स्थिति है।
ब्रायन सी। लेन

18

डेबियन पर और यह व्युत्पन्न है, आप /etc/sudoers.d/अधिकारों के साथ निर्देशिका में कस्टम स्क्रिप्ट सम्मिलित कर सकते हैं 0440- अधिक जानकारी के लिए /etc/sudoers.d/README देखें ।

यह मदद कर सकता है।


हालांकि यह टिप्पणी नहीं है?

2
@TomDworzanski: IMHO नं। देखें आदमी sudoers (5) और अन्य टिप्पणी
pevik

आप सही हे! लिंक और शानदार जवाब के लिए धन्यवाद।

3
मैं उस निर्देशिका को सेंटोस 7 के साथ
अलेक्जेंडर बर्ड

मुझे लगता है कि यह करने का सही तरीका है।
जनासन

11

संपादन के लिए विडोको को मानव इंटरफ़ेस माना जाता है /etc/sudoers। आप सीधे फाइल को बदलकर इसे प्राप्त कर सकते हैं, लेकिन आपको समवर्ती संपादन और वाक्यविन्यास सत्यापन के बारे में खुद को ध्यान रखना होगा। r--r-----अनुमतियों का ध्यान रखें ।


9

यदि आपकी sudoप्रविष्टियों को जोड़ने की अनुमति है /etc/sudoers.d, तो आप इस उत्तर का उपयोग @ dragon788 द्वारा कर सकते हैं:

https://superuser.com/a/1027257/26022

मूल रूप से आप visudoफ़ाइल को सत्यापित करने से पहले उसका उपयोग करते हैं /etc/sudoers.d, ताकि आप यह सुनिश्चित कर सकें कि आप sudoकिसी के लिए नहीं तोड़ रहे हैं ।

visudo -c -q -f filename

यह इसकी जाँच करता है और यदि यह वैध है, तो सफलता (0) देता है, इसलिए आप इसका उपयोग कर सकते हैं if, &&और अन्य स्क्रिप्ट बूलियन ऑपरेशन। एक बार जब आप वैध हो जाते हैं, तो बस इसे कॉपी करें /etc/sudoers.dऔर इसे काम करना चाहिए। सुनिश्चित करें कि इसका स्वामित्व जड़ से है और अन्य द्वारा लिखित नहीं है।


5

एक कस्टम संपादक सेट करें। मूल रूप से यह एक स्क्रिप्ट होगी जो फ़ाइल नाम (इस मामले में /etc/sudoers.tmp) को स्वीकार करती है, और उस स्थान को संशोधित और सहेजती है। तो आप बस उस फ़ाइल को लिख सकते हैं। जब आप कर रहे हैं, तो स्क्रिप्ट से बाहर निकलें, और विसूडो आपके लिए वास्तविक sudoers फ़ाइल को संशोधित करने का ध्यान रखेगा।

sudo EDITOR=/path/to/my_dummy_editor.sh visudo

क्या मैं सही हूं कि सभी dummy_editor.sh की आवश्यकता कुछ इस तरह से है? #!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0ऐसा लगता है यह मेरे लिए काम का होगा।
माउंटेनएक्स

4

जवाब के बहुत सारे, योको के लिए सूडो के साथ काम कर रहा था, लेकिन अब तक सेटअप कॉन्फ़िगरेशन को स्वचालित करने की आवश्यकता नहीं थी। मैंने ऊपर दिए गए कुछ उत्तरों के मिश्रण का उपयोग किया है, /etc/sudoers.d पर अपनी कॉन्फिग लाइन लिखते हुए स्थान शामिल किया है, इसलिए मुझे मुख्य sudoers फ़ाइल को संशोधित करने की आवश्यकता नहीं है, फिर सिंटैक्स के लिए उस फ़ाइल की जाँच करें, नीचे सरल उदाहरण:

एक sudoers के लिए अपनी लाइन लिखें फ़ाइल शामिल हैं:

sudo bash -c 'echo "your_user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/99_sudo_include_file'

जाँच करें कि आपके sudoers में फ़ाइल शामिल है, जो विंदु सिंटैक्स चेक से गुज़री है:

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file

बस तारांकन चिह्न छोड़ दें, यह नहीं होना चाहिए ^ ^
सोनाटा

यह और सफलता लौटाता है (0) - इसे मिला
ओलेग

2

बस ऊपर दिए गए उत्तरों में एक और विकल्प जोड़ने के लिए, यदि दौड़ की स्थिति एक प्रमुख चिंता का विषय नहीं है, तो निम्नलिखित कमांड का उपयोग मैन्युअल रूप से संशोधित फ़ाइल को कॉपी करने से बचने के लिए किया जा सकता है। /etc/sudoers

sudo EDITOR="cp /tmp/sudoers.new" visudo

यह सुनिश्चित करेगा कि नई फ़ाइल मान्य है और अनुमतियों के अपडेट के साथ सही तरीके से स्थापित है।

ध्यान दें कि यदि /tmp/sudoers.newफ़ाइल में कोई त्रुटि है तो visudoउपयोगकर्ता इनपुट के लिए संकेत देगा, इसलिए इसे visudo -c -f /tmp/sudoers.newपहले से जांचना उचित है ।


1

मुझे लगता है कि सबसे सीधा आगे समाधान है:

एक स्क्रिप्ट Createudoers.sh बनाएँ

#!/bin/sh

while [ -n "$1" ]; do
    echo "$1    ALL=(ALL:ALL) ALL" >> /etc/sudoers;
    shift # shift all parameters
done

और इसे उन उपयोगकर्ताओं के साथ कॉल करें जिन्हें आप इसे जोड़ना चाहते हैं:

root prompt> ./addsudoers.sh user1 user2

पूर्ण विवरण के लिए यह उत्तर देखें: शेल स्क्रिप्ट के माध्यम से sudoers में उपयोगकर्ताओं को जोड़ना

सादर!


0

इसे प्रतिध्वनित करने का प्रयास करें। आपको इसे एक सब-वेल में चलाना होगा, हालाँकि। उदाहरण:

sudo sh -c "echo \"group ALL=(user) NOPASSWD: ALL\" >> /etc/sudoers"


-2

यह मेरे लिए काम करता है जो दूसरों ने यहां पोस्ट किया है। जब मैंने अन्य लोगों की स्क्रिप्ट का उपयोग किया तो यह मेरे लिए विज़ुअड खोलेगी, लेकिन संपादन नहीं करेगी। इसने मुझे मानक उपयोगकर्ताओं सहित सभी उपयोगकर्ताओं को सफारी / फ़ायरफ़ॉक्स के लिए जावा 7u17 स्थापित करने की अनुमति देने के लिए आवश्यक संपादन किया।

#!/usr/bin/env bash
rm /etc/sudoers.new
cp /etc/sudoers /etc/sudoers.new
echo "%everyone   ALL = NOPASSWD: /usr/sbin/installer -pkg /Volumes/Java 7 Update 17/Java 7 Update 17.pkg -target /" >> /etc/sudoers.new
cp /etc/sudoers.new /etc/sudoers

इसने sudoers फ़ाइल के निचले भाग में सभी को% blah blah blah जोड़ दिया। मुझे स्क्रिप्ट को इस तरह चलाना था।

sudo sh sudoersedit.sh

गुड लक: डी

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