डरावना टर्मिनल कमांड को कैसे निष्क्रिय करें?


82

आप डरावने टर्मिनल कमांड को कैसे निष्क्रिय करते हैं?

मैं भौतिक सर्वर तक पहुंच के बिना दूरस्थ उबंटू सर्वर तक पहुंचने के लिए एसएसएच का उपयोग कर रहा था। मुझे लगा कि मैं shutdownUbuntu OS पर चलने वाले NoSQL सर्वर में ' ' टाइप कर रहा था , लेकिन वास्तव में मैंने Ubuntu सर्वर को बंद करने के लिए कहा था। फिर मुझे सर्वर एडमिन को बताना पड़ा कि मैंने क्या किया ताकि वह मेरे लिए फिजिकल सर्वर शुरू कर सके। यह शर्मनाक था!

मैं इसे फिर से होने से कैसे रोक सकता हूं?


100
यह लंबाई में चर्चा की गई है, आमतौर पर इस संबंध के साथ की rmतुलना में खराब दुष्प्रभाव हैं shutdown। निचला रेखा: यहां खराब चीजों को रोकने का कोई तरीका नहीं है यदि आप यादृच्छिक कमांड को रूट के रूप में चला रहे हैं।
दिमित्री ग्रिगोरीव

5
जैसा कि अन्य लोगों ने अलियासिंग के बारे में नोट किया है, ऐसा करने से लोग "गैर-मानक तरीके से काम करने वाले कमांड की आदत में शामिल हो सकते हैं।" तो क्या यह किसी और को बुरा लगता है कि मूर्खतापूर्ण NoSQL सर्वर इस कमांड का उपयोग करता है?
बंम

NoSQL सर्वर जो मैं उपयोग कर रहा था वह Redis है।
मेलोडियसफायर

60
बस रूट अकाउंट के तहत काम नहीं करते हैं।
alk

12
मेरा कहना है कि आपने सबक सीख लिया है इसलिए किसी भी कमांड को फिर से निष्क्रिय करने की आवश्यकता महसूस नहीं होगी। मैं यह भी जोड़ूंगा कि आप ग्नू / लिनक्स को मूर्ख न समझें, आप मूर्ख से बेहतर हैं।

जवाबों:


204

मानक उत्तर "रूट के रूप में लॉगिन न करें" है। रूट के रूप में चलने वाले सभी कमांड डरावने हैं। यदि ऐसा कोई विकल्प नहीं है, तो .bashrcआप विशेष रूप से डरावने आदेशों को अक्षम करने के लिए कुछ उपनामों को अपने में डाल सकते हैं। उदाहरण के लिए:

for scary in shutdown halt  reboot rm
do
    alias $scary="echo If you really want to do that, type: `which $scary`"
done

यदि आप शटडाउन टाइप करते हैं, तो आपको निम्न संदेश मिलेगा:

If you really want to do that, type: /sbin/shutdown

( सुनिश्चित करें कि आपके .bashrcद्वारा पहले लोड किया गया है, इससे पहले कि आप एक उत्पादन सर्वर पर यह कोशिश करें )

अपने वर्तमान sshसत्र को छोड़ना और फिर से लॉग इन करना, या उपयोग . ~/.bashrcकरना चाहिए। शायद rmयह सुनिश्चित करने के लिए कि आपके सर्वर ने .bashrcलॉगिन या समान पर लोडिंग को अक्षम नहीं किया है, बिना किसी तर्क के चलने की कोशिश करें ।

ध्यान दें कि यदि आप मुख्य रूप से हॉल्ट और शटडाउन से संबंधित हैं, तो आप मॉली-गार्ड को स्थापित करने पर विचार कर सकते हैं , जो मशीन को बंद करने से पहले होस्टनाम टाइप करेगा। यह अधिक उपयोगी है अगर आप नियमित रूप से कमांडलाइन पर पूरे OS'es को बंद करते हैं, लेकिन यह सुनिश्चित करना चाहते हैं कि आप सही बंद कर रहे हैं।

आप यह भी परीक्षण कर सकते हैं कि लॉगआउट या निकास जैसे कम डरावनी कमांड के साथ यह प्रयास करें।


70
रूट के रूप में लॉगिन न करें : यदि आप लॉग इन मशीन को भ्रमित कर रहे हैं तो यह मदद नहीं करेगा। मैं आपको एक दृश्य क्यू देने के लिए संकेत को बदलने का सुझाव दूंगा।
isanae

145
"सुरक्षित" व्यवहार करने के लिए "डरावना" आदेश मेरे अनुभव में, एक बुरा विचार है। ऐसा इसलिए है क्योंकि लोग एक गैर-मानक तरीके से काम करने वाले एक कमांड की आदत में पड़ जाते हैं जो उन्हें वेनिला सिस्टम पर होने पर कुछ बहुत ही अफसोसजनक काम कर सकता है। सरल उत्तर को रूट के रूप में लॉग इन करने पर बहुत सावधानी से चलना है।
तिमज

22
@isanae शॉर्टकट मैं उत्पादन सर्वर के लिए ssh के साथ एक टर्मिनल खोलने के लिए इस्तेमाल किया, टर्मिनल पृष्ठभूमि हल्का लाल कर देगा। इसने मुझे ध्यान दिया।
पीटर ए। श्नाइडर

6
sourceके लिए एक उपनाम है .और सभी गोले द्वारा समर्थित नहीं है।
गोनोस्तज

4
यह भी ध्यान दें कि डेबियन और, एक्सटेंशन द्वारा, उबंटू में डिफाल्ट ~/.bash_profileस्रोत है .bashrc, जो कि मानक व्यवहार नहीं है और अधिकांश प्रणालियों पर, .bashrcssh के माध्यम से लॉग इन करते समय नहीं पढ़ा जाता है, इसलिए इससे वहां कोई फर्क नहीं पड़ेगा। एलियंस को ~/.profileया ~/.bash_profileइसके बजाय जोड़ना बेहतर है ।
टेराडॉन

73

sudoएक कारण के लिए मौजूद है - इसका उपयोग करें। जब आपकी कमांड (इस मामले में एक इंटरेक्टिव सीएलआई) समाप्त हो जाती है, तो आपको अपने उपयोगकर्ता-स्तरीय शेल में वापस डाल दिया जाता है, रूट शेल नहीं। मूल शेल में होने के लिए बहुत कम योग्य कारण हैं। (मुझे आश्चर्य है कि यह पहले से ही एक उत्तर नहीं है ...)

कहा जा रहा है कि, सब कुछ केsudo लिए उपयोग करता है कि एक muppet मत बनो । समझें कि आप क्या कर रहे हैं, और समझें कि यह क्यों करता है / रूट विशेषाधिकार की आवश्यकता नहीं है।


इसके अतिरिक्त आप अपने प्रॉम्प्ट को रूट / यूजर शेल के लिए अलग कर सकते हैं। इससे यह भी स्पष्ट होता है कि आप शेल प्रॉम्प्ट पर वापस आ गए हैं और " कुछ अन्य सीएलआई " नहीं। मेरा बहुत रंगीन है, और बहुत सारी उपयोगी जानकारी है (जैसे होस्टनाम), जो यह जानना बहुत आसान बनाता है कि कमांड किस होस्ट पर अमल करेगा, और यह आपके इतिहास के माध्यम से वापस देखने और संकेतों का पता लगाने में भी आसान बनाता है - एक रूट शेल डिफ़ॉल्ट प्रॉम्प्ट का उपयोग करता है।

मेरा PS1

यह " आपके " खाते पर उपयोग करने के लिए अधिक उपयुक्त है , लेकिन यदि आप सुरक्षा / sysadminning को गंभीरता से ले रहे हैं, तो आप पासवर्ड / खाते साझा नहीं करेंगे, और आप पूरी जानकारी के बिना रूट शेल में नहीं बैठे होंगे।


जैसा कि लोगों ने कहा है, और बार-बार, " एक सुरक्षित वातावरण बनाने के लिए अलियासिंग कमांड एक बुरा विचार है "। आप अपने सुरक्षित वातावरण में आराम करने जा रहे हैं, उन 'डरावने' कमांड को टाइप करें जहाँ आपको नहीं करना चाहिए। फिर एक दिन आप नौकरी बदल लेंगे, या एक नई मशीन में प्रवेश करेंगे, और फिर " व्हाट्सएप, मैं मतलब नहीं था, मैं माफी चाहता हूँ " ...



2
क्या उसके साथ भी यही समस्या नहीं होगी sudo shutdown? अगर वह गलत मशीन पर इसे अंजाम देता है, यह अभी भी एक आपदा होगी।
बमर

2
@ बरमौर नोएसडी सूडो कमांड को नहीं समझता है?
तैमूर

2
@ टायमर sudoएक शेल कमांड है, इसका डेटाबेस से कोई लेना-देना नहीं है।
बरमार

4
@ बरमार: वास्तव में मुझे लगता है कि ओपी का मतलब है कि इसे नो एसक्यूएल cmdline प्रोग्राम में टाइप करना, न कि बैश में। इसलिए उन्होंने टाइप नहीं किया होगा sudo shutdown, क्योंकि मुझे लगता sudoहै कि NoSQL कमांड नहीं है। जड़ के गोले में न होना पूरी तरह से उस समस्या को हल कर देता है और एक बहुत अच्छा विचार है। इसलिए महत्वपूर्ण कमांड चलाने से पहले प्रॉम्प्ट को ध्यान से देखें।
पीटर कॉर्ड्स

44

पैकेज 'मौली-गार्ड' (कम से कम डेबियन व्युत्पन्न सिस्टम पर) शटडाउन, हॉल्ट, पॉवरऑफ और रिबूट के चारों ओर एक आवरण स्थापित करेगा। यदि यह पता लगाता है कि टर्मिनल एक रिमोट है, तो यह होस्ट के नाम के लिए संकेत देगा। यदि यह मेल नहीं खाता है, तो कमांड रद्द कर दिया गया है।


4
अन्य (यकीनन अधिक डरावनी) चीजों के बारे में क्या पसंद है rm -rf /?
मार्सेलथियारकेन

9
@marcellothearcane set -uकुछ मामलों में मदद कर सकता है, जैसे कि लिखते समय rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT
एलेक्स हॉल

4
@marcellothearcane आधुनिक लिनक्स सिस्टम से मिलती-जुलती किसी भी चीज़ पर, --no-preserve-rootजिसकी आपको दुर्घटना की संभावना नहीं है।
बजे एक CVn

3
कौन है मौली, मुझे आश्चर्य है ... शायद किसी की बिल्ली।
the0ther

7
@ the0ther, एक 2 साल का बच्चा, जिसने एक ही दिन में दो बार एक डायनासोर मशीन पर SCRAM स्विच को चालू किया। कमरे में मौजूद लोगों ने स्विच पर एक कवर लगाया। catb.org/jargon/html/M/molly-guard.html
CSM

4

मैंने एक जवाब स्वीकार किया कि मुझे बहुत पसंद है, हालांकि, अगर कोई और पढ़ रहा है और एक सरल उत्तर चाहता है, तो यहां मेरा है।

.Bashrc फ़ाइल ढूंढें और अंतिम पंक्ति के रूप में डालें:

alias shutdown=notforuse

फिर जब आप शटडाउन टाइप करते हैं तो आपको कुछ मिलता है ~bash: notforuse is not a command

यह मूर्खतापूर्ण हो सकता है लेकिन यह सरल है और यह काम करता है। मैं हालांकि यह करने के लिए बेहतर तरीकों के साथ उत्तर की सराहना करता हूं!


4
हम्म, मैं rmलोगों को ट्रोल करने के लिए ऐसा करता था -alias rm='echo "You can't use rm!" #'
एमडी एक्सएफ

52
मुझे लगता है कि यह तीन कारणों से एक बुरा विचार है। सबसे पहले, यह किसी और के लिए भ्रामक है जिसकी मशीन तक जड़ है। दूसरा, यह आपको प्रशिक्षित करता है कि "शटडाउन" टाइप करना और हिट दर्ज करना ठीक है, जिसका अर्थ है कि आपके द्वारा रूट एक्सेस की जाने वाली अगली प्रणाली पर भी यही गलती होने की संभावना है। तीसरा, यदि notforuseमार्ग में कभी भी कोई मान्य आदेश कहा जाता है, तो यह बहुत भ्रामक हो जाएगा ।
डेविड रिचरबी

5
मैं इस पर @DavidRicherby के साथ हूं। अच्छा विचार नहीं।
Tico

क्या तुम सच में उपनाम का उपयोग करना चाहते हैं, तो आप कम से कम उन सभी डाल सकते हैं डरा आदेश एक फ़ाइल में उपनाम, हम मान लें ~/.SaveMyReputationऔर अपने के रूप में अंतिम पंक्ति जोड़ने .bashrcके रूप में एक लाइन [ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation। आप अंततः echo "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell"उस फ़ाइल के अंदर एक अतिरिक्त लाइन जोड़ना चाह सकते हैं । कम से कम आप अपने साथ अन्य मशीन पर यह उपनाम फ़ाइल ला सकते हैं (यह होना चाहिए .bash_aliases, लेकिन इस "पदावनत" मामले में दूसरे नाम का उपयोग करना बेहतर है)।
हस्त्तूर

यदि आप ऐसा करने जा रहे हैं, तो जैसे नाम का उपयोग करके इसे कम भ्रमित करें alias shutdown=shutdown-disabled-by-an-alias। (यह केवल 3 डी और सबसे छोटी समस्या को संबोधित करता है जो @DavidRicherby ने बताया है।) हालांकि यह अभी भी अगले व्यक्ति के लिए केवल 2 सेकंड का समय लेगी, ताकि वह notforuse is not a commandदौड़ते हुए type -a shutdownऔर अन्य लोगों को देखने से जा सके, फिर sudo \shutdownउपनाम के विस्तार को अक्षम करने के लिए टाइप कर सके। (यह मानते हुए वे किया था sudoके लिए उपनामित sudo='sudo 'तो यह अपनी पहली आर्ग में उपनाम का विस्तार)।
पीटर कॉर्ड्स

1

के लिए shutdown( reboot, haltऔर संबंधित): मैं मुझसे पूछते हैं कि क्या मैं वास्तव में यकीन है (और यह वैसे भी कुछ नहीं करता है) के साथ एक प्रति है। मैं इस तरह की स्क्रिप्ट्स को स्टोर करता हूं /usr/local/sbin। डेबियन पर इसकी प्राथमिकता अन्य है /sbin(यह PATH की पहली निर्देशिका है)।

सिस्टम स्क्रिप्ट्स पूर्ण पथ का उपयोग करती हैं, इसलिए इस तरह की हैक मुझे स्थानीय मशीन ( विस्मयकारी WM से एक बुरा व्यवहार ) के बजाय एक दूरस्थ सर्वर को रोकने के लिए रोकती है , लेकिन अन्य अप्रत्यक्ष प्रभाव नहीं है, और मैं अभी भी उन्हें / sbin / shutdown के रूप में उपयोग कर सकता हूं जब वास्तव में आवश्यकता होती है ।


ऐसे हैक केवल तभी काम करते हैं जब आप उन्हें हर उस कंप्यूटर पर लागू करते हैं जिसे आप कभी लॉग इन करते हैं ... जो अक्सर काफी अव्यवहारिक होता है, और आपको यह पता नहीं चलेगा कि यह बहुत देर हो चुकी है: shutdownएक महत्वपूर्ण प्रणाली पर टाइप करके, जिसमें आपका हैक नहीं है।
jpaugh

@jpaugh: हाँ, यह एक हैक है, और मैं इसे केवल अपने निजी सर्वर के लिए उपयोग करता हूं, जहां मैं अक्सर लॉग इन करता हूं, और टर्मिनल बहुत अधिक समय तक खुले रहते हैं। [नोट: मैं अपनी व्यक्तिगत मशीनों के लिए भी अलग-अलग रंग संकेतों का उपयोग करता हूं: रिमोट-रूट, रिमोट-यूजर, लोकल-रूट, स्थानीय-उपयोगकर्ता]। असली सर्वर और रिमोट मशीन के लिए, मैं रूट से बचता हूं और मैं रूट से जितना संभव हो कम हो सकता है, और निश्चित रूप से, उनसे बाहर निकलने के लिए भूल के बिना। बस मैं अपने रीमेक को "क्लाउड" (क्लाउड हाइप से पहले, इसलिए पुराने तरीके से हैंडल करता हूं) के रूप में उपयोग कर रहा हूं।
जियाकोमो केटेनज़ी

1

Sudoers फ़ाइल केवल * से अधिक बारीक स्तर की दानेदारता की अनुमति देती है * 'sudo' * का उपयोग करने की अनुमति है, विशेष रूप से आप कमांड उपनामों का उपयोग कर सकते हैं कमांड के समूहों की सफेद सूची बनाने के लिए एक विशेष उपयोगकर्ता या समूह को प्रतिबंधित किया गया है। मैंने दूरस्थ सर्वरों के साथ काम किया है जो ssh एक्सेस तक सीमित थे और पासवर्ड-कम sudo की अनुमति देते थे (हमें पासवर्ड से सुरक्षित ssh कुंजियों की आवश्यकता थी)। ऐसा करने के लिए कुछ अच्छे कारण हैं, लेकिन इसके खतरे भी हैं, इसलिए हमने आदेश उपनामों का उपयोग उन चीज़ों के लिए अप्रतिबंधित पहुंच की अनुमति देने के लिए किया है, जो उन्हें (सर्वर आदि को फिर से शुरू करने के लिए) करने की आवश्यकता के बिना उन्हें विशेषाधिकार प्रदान किए बिना वे नहीं करते थे।

यह कहने के लिए वाक्यविन्यास भी है कि 'इस कमांड को नहीं चला सकते' । इसके चारों ओर काम किया जा सकता है, इसलिए इसका उपयोग वास्तविक सुरक्षा उपाय के रूप में नहीं किया जाना चाहिए, लेकिन यह आपके द्वारा वर्णित परिदृश्य के लिए काम करेगा।

मैन सूडर्स के पास कुछ अच्छे उदाहरण हैं कि यह कैसे स्थापित किया जाए।

बेशक यह sudo का उपयोग करने की आवश्यकता है, लेकिन यह कहे बिना जाना चाहिए।


1

आप कुछ नए उबंटू मूर्खता के शिकार हो सकते हैं।

उबंटू में सामान्य, क्लासिक shutdownकमांड हुआ करता था जो एक अनिवार्य समय तर्क लेता है।

यदि मैं shutdownएक नियमित उपयोगकर्ता के रूप में टाइप करता हूं , तो Ubuntu १२ पर क्या होता है :

$ shutdown
shutdown: time expected
Try `shutdown --help' for more information.

फिर

$ shutdown +100
shutdown: need to be root.

अब, यहाँ Ubuntu 16.10 है। मैं जड़ नहीं हूँ:

$ date ; /sbin/shutdown
Fri Jun 23 16:00:16 PDT 2017
Shutdown scheduled for Fri 2017-06-23 16:01:16 PDT, use 'shutdown -c' to   cancel.

कोई तर्क नहीं होने के बाद, यह 60 सेकंड के लिए बाद में शटडाउन को शेड्यूल करता है, और यहां तक ​​कि अगर आप रूट नहीं हैं - तो बस व्यवस्थापक विशेषाधिकारों के साथ बनाया गया खाता।

दोषपूर्ण दोष।


6
/sbin/shutdown systemd-sysvडिफ़ॉल्ट रूप से पैकेज द्वारा प्रदान किया जाता है, इसलिए यह उबंटू मूर्खता नहीं है, यह systemdमूर्खता है, और यह उबंटू से नहीं आता है, लेकिन डेबियन से कम से कम, जो बदले में, systemdरेड हैट से पूरे आंदोलन को ले जाता है । दोष देते समय, सही इकाई को दोष दें - न कि केवल एक जिसे आप नापसंद करते हैं।
रुस्लान

1
@Ruslan कोई भी जो इस बकवास को अपने डिस्ट्रो में पैकेज करता है वह मूर्खता के दोष से बच जाता है।
कज़

0

बंद के लिए मौली-गार्ड है। आपको बस इसे इंस्टॉल करने की आवश्यकता है और जब आप ssh के माध्यम से शटडाउन करने का प्रयास करते हैं, तो यह आपको hostname टाइप करने के लिए कहता है।

फ़ाइलों को हटाने के लिए libtrash जैसे समाधान हैं, जो एक LD_PRELOADपुस्तकालय के माध्यम से कचरा बिन का अनुकरण करता है ।

और आप परीक्षण कर सकते हैं कि आप किन फ़ाइलों को बदल रहे हैं / शायद कार्यक्रम के साथ / हटा रहे हैं ...। यह बहुत अच्छा है जब कुछ परीक्षण।


1
यह maybeबात डिज़ाइन से टूटी हुई लगती है: कुछ syscalls को बिना ऑप्स के स्टब करना किसी भी गैर-तुच्छ कार्यक्रम को क्रैश करने वाला है जो सफल होने के लिए इन syscalls पर निर्भर करता है।
दिमित्री ग्रिगोरीव

-2

इसे आज़माएं: जब आप एक दूरस्थ शेल पर होते हैं, तो हर बार जब आप "रिटर्न" कुंजी टाइप करने वाले होते हैं, तो 5 सेकंड के लिए रुकें, अपनी उंगली को "रिटर्न" कुंजी पर मँडराएँ, और जो कमांड आपको भेजने वाले हैं, उसे फिर से चलाएँ। ठीक है न? क्या आपको यकीन है?

यह कठोर लगता है, लेकिन, दूसरी ओर, हमें दूरस्थ गोले पर बहुत समय नहीं बिताना चाहिए। हमें अपने रखरखाव के काम को स्वचालित करने के सभी तरीके खोजने चाहिए ताकि हम शायद ही कभी, यदि कभी भी, एक दूरस्थ सर्वर पर लॉग इन करें।


कोशिश की कि काम न करूं। मैंने प्रवेश किया shutdown, 5 सेकंड के लिए रोक दिया, फिर से कमांड (जोर से!) और मुझे यकीन है कि यह सही था। फिर हिट दर्ज करें और कमांड निष्पादित किया गया। इसलिए यह डरावना कमांड को निष्क्रिय नहीं करता है, मुझे डर है। मैं इस उंगली मँडराती चीज़ के साथ कोशिश करूँगा, शायद दूरी बहुत छोटी / बड़ी थी।
wojciech_rak
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.