विशिष्ट कमांड के लिए हमेशा sudo पासवर्ड कैसे लागू करें?


12

दूसरे दिन मैं अपने वेब सर्वर पर कुछ रखरखाव कार्य कर रहा था। मैं जल्दी और नींद में था, इसलिए मैंने sudoकमांड का उपयोग करके सब कुछ किया ।

और फिर, मैंने गलती से Ctrl+ दबाया V, इस आदेश को मेरे वेब सर्वर पर भेजा:

sudo rm -rf /*

उन लोगों के लिए जो ऊपर दिए गए कमांड के बारे में सोच रहे हैं: इसने मेरे पूरे वेब सर्वर को हटा दिया

सौभाग्य से, मेरे पास बैकअप था और दुख की बात है कि मुझे इस भयानक त्रुटि को ठीक करने के लिए जागते हुए दो और घंटे बिताने पड़े। लेकिन तब से, मैं सोच रहा था:

क्या विशिष्ट कमांड के लिए हमेशा sudo पासवर्ड लागू करने का एक तरीका है?

अगर सर्वर मुझसे पासवर्ड मांगता है, तो मैं खुद को बहुत परेशानी से बचाऊंगा। ऐसा नहीं हुआ, क्योंकि मैं sudoइस राजसी त्रुटि से पहले लगभग 5 कमांड चला चुका था।

तो, वहाँ यह करने के लिए एक रास्ता है? मुझे केवल rmकमांड के साथ पासवर्ड की आवश्यकता है जिसे हमेशा लागू किया जाए। अन्य कमांड जो मैं उपयोग कर रहा हूं वे आमतौर पर nanoया cpजो दोनों (कुछ हद तक) वापस करने योग्य हैं।



2
rs /*कमांड को पास करने से पहले @solsTiCe का विस्तार किया जाता है। इसलिए कमांड को एक भी तर्क नहीं दिखता है, लेकिन तर्कों की एक सूची ( /bin /boot /cdrom /dev /etc /home...)
डैन

3
इससे दूर रहने के लिए एक महत्वपूर्ण सबक यह है कि जब तक आपको वास्तव में ज़रूरत न हो, आपको सुडो के साथ चीजों को नहीं चलाना चाहिए। मुझे पता है कि आपने यहां जो भी पूछा उसका जवाब नहीं है, लेकिन यह सवाल है कि कैसे (उम्मीद है) अपने आप को अपने सर्वर को फिर से हटाने से रोकें, और सूदो से बचना आपके खिलाफ रक्षा की पहली पंक्ति होनी चाहिए।
डेविड जेड


2
@ WinEunuuchs2Unix यह एक डुप्लिकेट प्रश्न नहीं है, यहाँ सेशन rmकमांड को पासवर्ड नहीं देना चाहता है । वे बस sudoएक बार जब rm कमांड का उपयोग किया जाता है, उसके लिए संकेत देना चाहते हैं । आपके द्वारा लिंक किए गए प्रश्न का हल आपकी पहली कमांड होने पर थोड़ा कष्टप्रद हो जाएगा sudo rm। जैसे कि यह आपसे दो पासवर्ड मांगेगा, एक के लिए sudoएक rm
दान

जवाबों:


17

आप सेट कर सकते हैं timestamp_timeoutकरने के लिए 0विशेष रूप से आदेश के लिए /etc/sudoersvisudo -f /etc/sudoers.d/pduckनिम्नलिखित सामग्री के साथ एक फ़ाइल बनाएँ :

Cmnd_Alias DANGEROUS = /bin/rm

Defaults!DANGEROUS timestamp_timeout=0

pduck ALL = (ALL:ALL) DANGEROUS

अब उपयोगकर्ता pduckको हमेशा पासवर्ड के लिए कहा जाता है, जब sudo rmकोई सदस्य (अतिरिक्त पैरामीटर क्या दिया जाता है), भले ही उपयोगकर्ता sudoसमूह का सदस्य हो और sudoअन्य कमांड के लिए उसका पासवर्ड याद रखता हो।

नकारात्मक पक्ष यह है कि आप इसे /bin/rmप्रतिबंधित करने के लिए फ़ाइल में लाइन में आसानी से पैरामीटर नहीं जोड़ सकते हैं । ठीक है ... आप कर सकते हैं, जैसे:

Cmnd_Alias DANGEROUS = /bin/rm -f

लेकिन फिर आप उदाहरण के sudo rm -fलिए sudo rm -rf, बिल्कुल और फिर (फिर से) के लिए प्रेरित नहीं होते हैं ।


9

एक तरीका सुरक्षित-आरएम का उपयोग करना होगा । यह केवल "आरएम" के उपयोग को स्वीकार करेगा और "आरएम" के विशिष्ट संस्करणों को चलाने से रोकेगा। जिसमें आपके रूट सिस्टम को हटाना शामिल है, लेकिन सिस्टम संबंधित निर्देशिका जैसे "/ usr /" या "/ var /" को हटाने के लिए भी उपयोग किया जा सकता है। लिंक से:

महत्वपूर्ण फाइलों के आकस्मिक विलोपन को रोकना

सेफ़-आरएम एक सुरक्षा उपकरण है जिसका उद्देश्य महत्वपूर्ण फाइलों /bin/rmको एक रैपर के साथ हटाकर दुर्घटना को रोकना है , जो फ़ाइलों और निर्देशिकाओं के एक कॉन्फ़िगर करने योग्य ब्लैकलिस्ट के खिलाफ दिए गए तर्कों की जांच करता है जिन्हें कभी भी हटाया नहीं जाना चाहिए।

जो उपयोगकर्ता इन संरक्षित फ़ाइलों या निर्देशिकाओं में से एक को हटाने का प्रयास करते हैं, वे ऐसा करने में सक्षम नहीं होंगे और इसके बजाय चेतावनी संदेश दिखाया जाएगा:

$ rm -rf /usr   
Skipping /usr

(संरक्षित पथ साइट और उपयोगकर्ता दोनों स्तरों पर सेट किए जा सकते हैं।)

गलती से आपके द्वारा हटाई गई महत्वपूर्ण फ़ाइलों को पुनर्प्राप्त करना काफी कठिन हो सकता है। सुरक्षित-आरएम लगाकर आज खुद को सुरक्षित रखें और इस संभावना को कम करें कि आपको डेटा रिकवरी सेवा से संपर्क करना होगा!

यहाँ छवि विवरण दर्ज करें


तिजोरी के लिए ऊपर चढ़ा हुआ
माइकल फुल्टन

3

sudoएक विकल्प प्रदान करता है -k, --reset-timestamp, देखें man sudo:

जब एक कमांड या एक विकल्प के साथ संयोजन में उपयोग किया जाता है, जिसमें पासवर्ड की आवश्यकता हो सकती है, तो यह विकल्प उपयोगकर्ता के कैश्ड क्रेडेंशियल्स को अनदेखा करने का कारण होगा। परिणामस्वरूप, sudo एक पासवर्ड के लिए संकेत देगा (यदि सुरक्षा नीति के लिए आवश्यक है) और उपयोगकर्ता की कैश्ड क्रेडेंशियल्स को अपडेट नहीं करेगा।

आप sudoपरीक्षण rm -rf /*और चलाने के लिए एक साधारण आवरण लिख सकते हैं

sudo -k rm -rf /*

इसके बजाय, इस तरह से:

sudo ()                                                                                                                                                 
{ 
    [[ "$*" == "rm -rf /*" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

उदाहरण उपयोग

echo aयहाँ के साथ परीक्षण ।

$ sudo echo
[sudo] password for dessert: 

$ sudo echo

$ sudo echo a
[sudo] password for dessert: 
a
$ sudo echo a
[sudo] password for dessert: 
a

यदि आप सामान्य रूप से चलने के लिए हर बार पूछना चाहते हैं rm, तो आप उपरोक्त फ़ंक्शन को निम्नानुसार अनुकूलित कर सकते हैं:

sudo () 
{ 
    [[ "$1" == "rm" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

यदि आप सामान्य कमांड कॉल और विशिष्ट कमांड लाइन को संयोजित करना चाहते हैं case, जिसका मैं उपयोग करता हूं , जैसे:

sudo () 
{ 
    case "$*" in 
        rm*)            opt="-k" ;;
        "mv /home"*)    opt="-k" ;;
        "ln -s /usr/bin/fish /bin/sh") opt="-k" && echo "Don't you dare!" ;;
        *)              opt="" ;;
    esac;
    /usr/bin/sudo $opt "$@"
}

ध्यान दें कि यदि आप sudoविकल्पों के साथ चलते हैं तो ये दृष्टिकोण काम नहीं करेंगे - [[ "$*" =~ " rm " ]]रिक्त स्थान से घिरे स्ट्रिंग "आरएम" *" rm "*)के caseलिए या "आरएम" युक्त किसी भी कमांड लाइन को पकड़ने के लिए संभव समाधान हैं ।


[[ "$1" == "rm" ]] && opt="-k";और कैसे /bin/rm?
रिनजविंड

@ रिनविंड मुझे लगता है कि फ़ंक्शन आसानी से विशिष्ट आवश्यकताओं, विशेष रूप से caseदृष्टिकोण के अनुकूल है ।
मिठाई

1

यह उत्तर sudoआपके प्रश्न के भाग को संबोधित नहीं करता है, लेकिन दूसरी ओर यह किसी भी उपयोगकर्ता के rmलिए आकस्मिक चालान के खतरे को कम करने का एक तरीका है ।

आप कर सकते हैं उर्फ rmकरने के लिए rm -Iजो

  • जैसे ही यह एक निर्देशिका या 3 से अधिक फ़ाइलों को हटा देगा पुष्टि के लिए पूछता है
  • जब तक आप बाहर निकलते हैं-f जो पिछले -Iविकल्पों को ओवरराइड करता है।

--one-file-systemअनधिकृत विलोपन के विरुद्ध एक और संभावित सुरक्षा उपाय है जिसका उपयोग मैं अपने rmउपनाम में करता हूं ।

सेट अप

ऐसा उपनाम बनाने के लिए कमांड का उपयोग करें:

alias rm='rm -I --one-file-system'

आप इसे अपने ~/.bashrcया में भी डाल सकते हैं /etc/bash.bashrc

प्रयोग

$ sudo rm -r /etc/apt/sources.list.d /*
rm: remove all arguments?

yesअपने लोकेल या शब्द और प्रेस के पहले अक्षर में टाइप या इसके अनुवाद की पुष्टि करने के लिए Enter। किसी भी अन्य इनपुट सहित कोई भी ऑपरेशन को निरस्त नहीं करता है।

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