2008-11-27 18 views
74

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

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

क्या मैं इसे कॉपी और संशोधित कर सकता हूं, फिर क्या विज़ुडो संशोधित प्रति के साथ मूल को प्रतिस्थापित कर सकता है? संपादक में अपनी खुद की लिपि प्रदान करके?

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

प्रश्न कुछ काम करने के बारे में संभावित मुद्दों के बारे में अधिक है।

उत्तर

29

तुम एक अस्थायी फ़ाइल को संपादित करना चाहिए, फिर 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 
+0

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

+0

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

+0

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

8

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

+3

+1! – wchargin

5

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

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

क्या मैं सही हूं कि सभी dummy_editor.sh की आवश्यकता है इस तरह कुछ है? ! '#/Bin/श; echo "# sudoers में मेरे परिवर्तन" >> $ 1; बाहर निकलें 0 'यह मेरे लिए काम करता प्रतीत होता है। – MountainX

42

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

#!/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 
+4

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

+0

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

+0

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

-1

यह मेरे लिए बंद आधारित क्या दूसरों यहां पोस्ट में काम किया। जब मैंने अन्य लोगों की स्क्रिप्ट का इस्तेमाल किया तो यह मेरे लिए विसुडो खोल देगा लेकिन संपादन नहीं करेगा। इसने संपादन को बनाया है जो मुझे मानक उपयोगकर्ताओं समेत सभी उपयोगकर्ताओं को सफारी/फ़ायरफ़ॉक्स के लिए जावा 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 

इसने% सब ब्ला ब्ला ब्लाउ को सूडोर्स फ़ाइल के नीचे जोड़ा। मुझे इस तरह की स्क्रिप्ट चलाने की ज़रूरत थी।

sudo sh sudoersedit.sh 

गुड लक: डी

2

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

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

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

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

+0

अच्छा हैक, – Aki

11

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

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

+0

का उपयोग किया गया है, हालांकि यह टिप्पणी नहीं की गई है? –

+1

@TomDworzanski: IMHO संख्या। देखें [मैन सूडर्स (5)] (http://www.sudo.ws/man/1.8.15/sudoers.man.html#x4f74686572207370656369616c206368617261637465727320616e6420726573657276656420776f726473) और [अन्य टिप्पणी] (http://unix.stackexchange.com/questions/244,064/क्यों-हैं-में शामिल हैं और includedir-निर्देशों में sudo-उपसर्ग के-साथ-पाउंड)। – pevik

+0

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

1

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

एक स्क्रिप्ट addsudoers.sh

#!/bin/bash 

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

बनाएँ और आप के रूप में यह जोड़ना चाहते हैं उन से कॉल करने की:

root prompt> ./addsudoers.sh user1 user2 

पूर्ण स्पष्टीकरण के लिए यह उत्तर देखें: Adding users to sudoers through shell script

सम्मान!

0

इसे गूंजने का प्रयास करें। हालांकि, आपको इसे सबशेल में चलाने की ज़रूरत है। उदाहरण:

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

86

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

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

में करता हूं यह एक अच्छा जवाब है। संपूर्ण सबहेल रूट के रूप में निष्पादित किया जाना चाहिए, उदा। 'echo "$ USER ALL = NOPASSWD:/usr/bin/rsync" | (सुडो सु-सी 'संपादक = "टीई" visudo -f /etc/sudoers.d/rsync') '। – simon

+1

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

+1

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

3

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

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

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

visudo -c -q -f filename 

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

संबंधित मुद्दे

 संबंधित मुद्दे