सवाल मैं आकस्मिक आरएम-आरएफ / * को कैसे रोकूं?


मैं बस भाग गया rm -rf /* गलती से, लेकिन मेरा मतलब था rm -rf ./* (स्लैश के बाद स्टार को नोटिस करें)।

alias rm='rm -i' तथा --preserve-root डिफ़ॉल्ट रूप से मुझे बचाया नहीं है, तो इसके लिए कोई स्वचालित सुरक्षा उपाय हैं?


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


दो बार सोचने और मस्तिष्क का उपयोग करने के बारे में। मैं वास्तव में इसका उपयोग कर रहा हूँ! लेकिन मैं 10 जटिल चीजों को शामिल करने वाले कुछ जटिल प्रोग्रामिंग कार्यों को हल करने के लिए इसका उपयोग कर रहा हूं। मैं इस कार्य में गहराई से डूब गया हूं, झंडे और पथों की जांच के लिए कोई मस्तिष्क शक्ति नहीं छोड़ी गई है, मैं आदेशों और तर्कों के संदर्भ में भी नहीं सोचता, मुझे लगता है कि 'खाली वर्तमान डीआईआर' जैसे कार्यों के संदर्भ में, मेरे दिमाग का अलग-अलग हिस्सा उन्हें आदेशों में अनुवाद करता है और कभी-कभी यह गलती करता है। मैं चाहता हूं कि कंप्यूटर उन्हें कम से कम खतरनाक लोगों को सही करे।


156
2017-12-02 17:09


मूल


एफवाईआई, आप भी कर सकते हैं rm -rf . /mydir के बजाय rm -rf ./mydir और जो भी निर्देशिका आप में थे उसे मार डालो। मुझे लगता है कि यह अक्सर होता है। - user606723
बंदूक समानता का उपयोग करने के लिए, यह सवाल कहता है कि कृपया बंदूक को पहचानें कि मैं अपने पैर पर लक्ष्य रख रहा हूं, आग नहीं, लेकिन मैं अपने पैर पर बंदूक को पहले स्थान पर नहीं रखने के लिए कोई ज़िम्मेदारी नहीं लेना चाहता हूं। बंदूकें, और कंप्यूटर बेवकूफ हैं और यदि आप एक बेवकूफ चीज करते हैं तो आपको ये परिणाम मिलेंगे। बंदूक समानता के साथ, सतर्कता और अभ्यास को छोड़कर कुछ भी आपको चोट पहुंचाने से नहीं बचाएगा। - slillibri
@ सिलीबिरी इसके अलावा rm एक बंदूक नहीं है, यह एक कंप्यूटर प्रोग्राम है, यह सकता है यह निर्धारित करने के लिए पर्याप्त स्मार्ट हो कि उपयोगकर्ता कुछ महत्वपूर्ण फाइलों को हटाने जा रहा है और एक चेतावनी जारी कर रहा है (जैसा कि आप वास्तव में करते हैं तो ऐसा करते हैं rm -rf / स्टार के बिना)। - Valentin Nemcev
@slillibri बंदूकें safeties है। पूछना कि कैसे बेहतर safeties को रखा जाए rm आदेश एक पूरी तरह से वैध sysadmin सवाल है। - Gilles
सुडो आरएम / बिन / आरएम अनुशंसित नहीं है, लेकिन अधिकांश आरएम को रोक देगा :-) - Paul


जवाब:


मेरे द्वारा अनुसरण की जाने वाली चालों में से एक है # शुरुआत करते समय शुरुआत में rm आदेश।

root@localhost:~# #rm -rf /

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

या

यदि आप किसी भी महत्वपूर्ण निर्देशिका को रोकना चाहते हैं, तो एक और चाल है।

नाम की एक फाइल बनाएँ -i उस निर्देशिका में। इस तरह की एक अजीब फ़ाइल कैसे बनाई जा सकती है? का उपयोग करते हुए touch -- -i या touch ./-i

अब कोशिश करो rm -rf *:

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

यहां ही * विस्तार होगा -i कमांड लाइन के लिए, तो आपका आदेश अंततः बन जाता है rm -rf -i। इस प्रकार कमांड हटाने से पहले संकेत मिलेगा। आप इस फाइल को अपने अंदर रख सकते हैं /, /home/, /etc/, आदि।

या

उपयोग --preserve-root एक विकल्प के रूप में rm। में rm नए में शामिल coreutils पैकेज, यह विकल्प डिफ़ॉल्ट है।

--preserve-root
              do not remove `/' (default)

या

उपयोग सुरक्षित-rm

वेबसाइट से उद्धरण:

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

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

$ rm -rf /usr
Skipping /usr

215
2017-12-02 23:36



सुरक्षित आरएम बहुत अच्छा लग रहा है, अब इसे देख रहा है ... - Valentin Nemcev
सुरक्षित आरएम साफ है। इसके अलावा यह एक निफ्टी चाल है -i फ़ाइल। हा। मूर्खतापूर्ण बाश - EricR
आश्चर्यजनक है कि यूनिक्स में किस तरह की चालबाजी की जाती है। - WernerCD
-आई नामक बनाने वाली फाइल पूरी तरह से शुद्ध प्रतिभा है। मैं एक साल पहले इसका इस्तेमाल कर सकता था जब मैंने गलती से वीपीएस पर आरएम-आरएफ / आदि / * चलाया ... (सौभाग्य से, मैं रात में स्नैपशॉट लेता हूं, इसलिए 45 मिनट से कम समय में बहाल करने में सक्षम था)। - David W
यह प्रतिभा है। जादूगर होगा touch -- -rf - Mircea Vutcovici


तुम्हारी समस्या:

मैं बस आरएम-आरएफ / * गलती से भाग गया, लेकिन मेरा मतलब आरएम-आरएफ ./* (स्लैश के बाद स्टार को नोटिस करें)।

समाधान: ऐसा मत करो! अभ्यास के मामले में, उपयोग न करें ./ एक पथ की शुरुआत में। स्लैश कमांड में कोई मूल्य नहीं जोड़ते हैं और केवल भ्रम पैदा करेंगे।

./*जैसा कि वही बात है *, इसलिए उपरोक्त आदेश बेहतर लिखा गया है:

rm -rf *

यहां एक संबंधित समस्या है। मैं अक्सर निम्नलिखित अभिव्यक्ति देखता हूं, जहां किसी ने इसे माना FOO कुछ ऐसा करने के लिए सेट है /home/puppies। मैंने इसे आज वास्तव में, एक प्रमुख सॉफ्टवेयर विक्रेता से दस्तावेज में देखा।

rm -rf $FOO/

लेकिन अगर FOO सेट नहीं है, यह मूल्यांकन करेगा rm -rf /, जो आपके सिस्टम पर सभी फाइलों को हटाने का प्रयास करेगा। पिछला स्लैश अनावश्यक है, इसलिए अभ्यास की बात इसका उपयोग नहीं करती है।

निम्नलिखित एक ही काम करेंगे, और आपके सिस्टम को भ्रष्ट करने की संभावना कम है:

rm -rf $FOO

मैंने इन सुझावों को कठिन तरीके से सीखा है। जब 14 साल पहले मेरा पहला सुपरसियर खाता था, तो मैं गलती से भाग गया rm -rf $FOO/ एक शेल स्क्रिप्ट के भीतर से और एक प्रणाली को नष्ट कर दिया। 4 अन्य sysadmins इस पर देखा और कहा, 'हाँ। हर कोई एक बार ऐसा करता है। अब आपका इंस्टॉल मीडिया (36 फ्लॉपी डिस्क) है। इसे ठीक करें। '

यहां अन्य लोग समाधान की सलाह देते हैं --preserve-root तथा safe-rm। हालांकि, ये समाधान सभी अन * xe-varients के लिए मौजूद नहीं हैं और होलारिस, फ्रीबीएसडी और मैकोज़क्स पर काम नहीं कर सकते हैं। के अतिरिक्त, safe-rm यह आवश्यक है कि आप अपने द्वारा उपयोग किए जाने वाले प्रत्येक एकल सिस्टम सिस्टम पर अतिरिक्त पैकेज इंस्टॉल करें। यदि आप भरोसा करते हैं safe-rm, जब आप एक नई नौकरी शुरू करते हैं तो क्या होता है और उनके पास नहीं होता है safe-rm स्थापित? ये उपकरण एक क्रैच हैं, और ज्ञात डिफ़ॉल्ट पर भरोसा करना और अपनी कार्य आदतों में सुधार करना बेहतर है।


42
2017-12-02 18:58



मेरे दोस्त ने मुझे बताया कि वह कभी भी उपयोग नहीं करता है rm -rf *। वह हमेशा पहले निर्देशिका को बदलता है, और एक विशिष्ट लक्ष्य का उपयोग करता है। इसका कारण यह है कि वह शैल के इतिहास का बहुत उपयोग करता है, और वह चिंतित है कि उसके इतिहास में ऐसा आदेश गलत समय पर पॉप अप हो सकता है। - haggai_e
@ haggai_e: अच्छी टिप। जब मैं यूनिक्स के लिए नया था, तो मैं एक बार एक बग में भाग गया जहां rm -rf * भी हटा दिया . तथा ..। मैं जड़ था, और यह कम निर्देशिकाओं में घुस गया ../../.., और काफी विनाशकारी था। मैं बहुत सावधान रहने की कोशिश करता हूं rm -rf * तभी से। - Stefan Lasiewski
rm -rf $FOO यदि आपको आवश्यकता हो तो मदद नहीं करेगा rm -rf $FOO/$BAR। cd $FOO && rm -rf $BAR मदद मिलेगी, हालांकि यह लंबा रास्ता है। - Victor Sergienko
@VictorSergienko, बैश के साथ, निर्दिष्ट करने के बारे में कैसे ${FOO:?}, जैसे की rm -rf ${FOO:?}/ तथा rm -rf ${FOO:?}/${BAR:?}। यह इसे कभी भी अनुवाद करने से रोक देगा rm -rf /। मेरे पास मेरे जवाब में इसके बारे में कुछ और जानकारी है यहाँ। - A-B-B
@haggai_e: मुझे इस विषय पर सबसे अच्छी सलाह मिलती है। मैंने अपनी उंगली का उपयोग करके जला दिया rm -rf * एक लूप में जो गलती से गलत निर्देशिका में बदल गया और कुछ और हटाने को समाप्त कर दिया। अगर मैं एक विशिष्ट लक्ष्य का उपयोग करता, तो गलत चीज़ को हटाने के लिए बहुत कम मौका होता। - richk


चूंकि यह "सर्वरफॉल्ट" पर है, इसलिए मैं यह कहना चाहूंगा:

यदि आपके पास दर्जन या अधिक सर्वर हैं, तो व्यवस्थापक / उपयोगकर्ताओं की एक बड़ी टीम के साथ, कोई व्यक्ति जा रहा है rm -rf या chown गलत निर्देशिका

कम से कम संभव एमटीटीआर के साथ प्रभावित सेवा को वापस पाने के लिए आपके पास एक योजना होनी चाहिए।


30
2017-12-02 20:42



और आपको वसूली का अभ्यास करने के लिए एक वीएम या स्पेयर बॉक्स का उपयोग करना चाहिए - पता लगाएं कि क्या काम नहीं किया और योजना को परिष्कृत किया। हम पखवाड़े रिबूट में शामिल हो रहे हैं - क्योंकि हमारी इमारत में बिजली की कमी हुई है, और हर बार यह दर्दनाक रहा है। सभी रैकों के कुछ नियोजित शट डाउन करके, हमने इसे लगभग 3 घंटों तक चलने के कुछ दिनों से काट दिया है - हर बार जब हम सीखते हैं कि इत्यादि के लिए init.d स्क्रिप्ट को स्वचालित / ठीक करने के लिए कौन से बिट्स हैं। - Danny Staple
और इस कमांड को वीएम पर आज़माएं। यह दिलचस्प है! लेकिन पहले स्नैपशॉट लें। - Stefan Lasiewski


सर्वोत्तम समाधानों में आपकी आदतों को बदलने के लिए उपयोग नहीं करना शामिल है rm सीधे।

एक दृष्टिकोण चलाने के लिए है echo rm -rf /stuff/with/wildcards* प्रथम। जांचें कि वाइल्डकार्ड से आउटपुट उचित दिखता है, फिर बिना किसी कमांड को निष्पादित करने के लिए खोल के इतिहास का उपयोग करें echo

एक और तरीका सीमित करना है echo उन मामलों के लिए आदेश जहां यह स्पष्ट रूप से स्पष्ट है कि आप क्या हटाएंगे। किसी निर्देशिका में सभी फ़ाइलों को हटाने के बजाय, निर्देशिका को हटाएं और एक नया बनाएं। मौजूदा निर्देशिका का नाम बदलने के लिए एक अच्छी विधि है DELETE-foo, फिर एक नई निर्देशिका बनाएँ foo उचित अनुमतियों के साथ, और अंत में हटा दें DELETE-foo। इस विधि का साइड लाभ यह है कि आपके इतिहास में दर्ज किया गया आदेश है rm -rf DELETE-foo

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir             # just to make sure we're deleting the right thing
rm -rf DELETE-somedir

यदि आप वास्तव में फ़ाइलों का एक समूह हटाने पर जोर देते हैं क्योंकि आपको निर्देशिका को रहने की आवश्यकता है (क्योंकि यह हमेशा मौजूद होना चाहिए, या क्योंकि आपके पास इसे फिर से बनाने की अनुमति नहीं है), फ़ाइलों को एक अलग निर्देशिका में ले जाएं, और उस निर्देशिका को हटाएं ।

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

(उसे मारो ऑल्ट+ कुंजी।)

अंदर से एक निर्देशिका को हटाना आकर्षक होगा, क्योंकि rm -rf . इसलिए संक्षेप में टाइपो का कम जोखिम है। दुर्भाग्य से, विशिष्ट सिस्टम आपको ऐसा करने नहीं देते हैं। आप कर सकते हैं rm -rf -- "$PWD" इसके बजाय, टाइपो के उच्च जोखिम के साथ, लेकिन उनमें से अधिकतर कुछ भी हटाने का कारण नहीं बनते हैं। सावधान रहें कि यह आपके शैल इतिहास में एक खतरनाक आदेश छोड़ देता है।

जब भी आप कर सकते हैं, संस्करण नियंत्रण का उपयोग करें। आप नहीं करते rm, आप cvs rm या जो भी हो, और यह पूर्ववत है।

ज़श के पास दौड़ने से पहले आपको संकेत देने के विकल्प हैं rm एक तर्क के साथ जो निर्देशिका में सभी फाइलों को सूचीबद्ध करता है: rm_star_silent (डिफ़ॉल्ट रूप से) निष्पादन से पहले संकेत देता है rm whatever/*, तथा rm_star_wait (डिफ़ॉल्ट रूप से बंद) 10-सेकंड की देरी जोड़ता है जिसके दौरान आप पुष्टि नहीं कर सकते हैं। यदि आप किसी निर्देशिका में सभी फ़ाइलों को निकालने का इरादा रखते हैं, तो यह सीमित उपयोग का है, क्योंकि आप पहले ही प्रॉम्प्ट की अपेक्षा करेंगे। यह टाइपो को रोकने में मदद कर सकता है rm foo * के लिये rm foo*

चारों ओर तैरने वाले कई और समाधान हैं जिनमें परिवर्तन शामिल है rm आदेश। इस दृष्टिकोण की एक सीमा यह है कि एक दिन आप असली मशीन के साथ होंगे rm और आप स्वचालित रूप से कॉल करेंगे rm, पुष्टि की आपकी अपेक्षा में सुरक्षित ... और अगली बात आप बैकअप को पुनर्स्थापित कर देंगे।


23
2017-12-02 22:33



mv -t DELETE_ME -- * थोड़ा और मूर्ख है। - Tobu
@Giles का उपयोग नहीं कर रहा है rm सीधे अच्छी सलाह है! एक बेहतर विकल्प है उपयोग find आदेश। - aculich
और यदि आपको रहने के लिए निर्देशिका की आवश्यकता है तो आप इसे आसानी से कर सकते हैं find somedir -type f -delete जो सभी फाइलों को हटा देगा somedir लेकिन निर्देशिका और सभी उपनिर्देशिका छोड़ देंगे। - aculich


जैसा कि आपने उल्लेख किया है, आप हमेशा उपनाम कर सकते हैं:

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

आप अपने हार्ड डिस्क को पोंछकर अपने आप को अपमानित करने के बारे में अपने दोस्तों को सतर्क करने के लिए कमांडलाइन ट्विटर क्लाइंट के साथ इसे एकीकृत भी कर सकते हैं rm -fr /* जड़ के रूप में


18
2017-12-02 17:16



Telnet miku.acm.uiuc.edu के लिए +1 - Ali
ऊर्फ echo = "telnet miku.acm.uiuc.edu" - kubanczyk
मुझे पुराना स्कूल नहीं होना चाहिए ... इसका क्या महत्व है telnet miku.acm.uiuc.edu? - Kyle Strand
इसे आज़माएं और पता लगाएं। यह विनाशकारी है। यदि आप जितना हो उतना पागल हो, तो वीएम में भाग लें। - Naftuli Kay
-1 आप उनमें से रिक्त स्थान के साथ कमांड नहीं कर सकते हैं अकेले / * जो एक अवैध नाम है - xenithorb


हां: जड़ के रूप में काम न करें और अभिनय से पहले दो बार सोचें।

इसके अलावा, कुछ ऐसा देखो https://launchpad.net/safe-rm


15
2018-02-26 05:50



संपादन में रूट के रूप में काम करना उल्लेख किया - Valentin Nemcev
@ वेलेंटीन: ओ_ओ !! - Jonathan Rioux


आकस्मिक को रोकने का सबसे आसान तरीका rm -rf /* के सभी उपयोग से बचने के लिए है rm आदेश! असल में, मैं हमेशा दौड़ने के लिए लुभाना चाहता हूं rm /bin/rm पूरी तरह से आदेश से छुटकारा पाने के लिए! नहीं, मैं मुखर नहीं हूं।

इसके बजाय उपयोग करें -delete का विकल्प find आदेश, लेकिन फ़ाइलों को हटाने से पहले मैं अनुशंसा करता हूं कि आप कौन सी फाइलों को हटाएंगे:

find | less

नोट, के आधुनिक संस्करणों में find यदि आप किसी निर्देशिका का नाम छोड़ देते हैं, तो यह निश्चित रूप से वर्तमान निर्देशिका का उपयोग करेगा, इसलिए उपरोक्त समकक्ष है:

find . | less

एक बार जब आप सुनिश्चित हों कि ये वे फ़ाइलें हैं जिन्हें आप हटाना चाहते हैं तो आप जोड़ सकते हैं -delete विकल्प:

find path/to/files -delete

तो, न केवल है find  उपयोग करने के लिए सुरक्षित, यह भी अधिक अभिव्यक्तिपूर्ण है, इसलिए यदि आप निर्देशिका पदानुक्रम में केवल कुछ फ़ाइलों को हटाना चाहते हैं जो किसी विशेष पैटर्न से मेल खाते हैं तो आप पूर्वावलोकन के लिए इस तरह की अभिव्यक्ति का उपयोग कर सकते हैं, फिर फ़ाइलों को हटाएं:

find path/to/files -name '*~' | less
find path/to/files -name '*~' -delete

सीखने और उपयोग करने के बहुत सारे अच्छे कारण हैं find बस एक सुरक्षित के अलावा rm, यदि आप उपयोग करने के लिए सीखने के लिए समय लेते हैं तो आप बाद में धन्यवाद देंगे find


15
2017-12-03 22:44



बहुत रोचक चर्चा। मुझे आपका दृष्टिकोण पसंद है और थोड़ा स्निपेट बनाया है। यह अति अक्षम है, क्योंकि यह कॉल 3 बार मिलता है, लेकिन मेरे लिए यह एक अच्छी शुरुआत है: github.com/der-Daniel/fdel - Daniel Hitzel