سؤال كيف يمكنني منع عرضي rm -rf / *؟


أنا ركضت للتو rm -rf /* عن طريق الخطأ ، ولكن قصدته rm -rf ./* (لاحظ النجم بعد الخط المائل).

alias rm='rm -i' و --preserve-root بشكل افتراضي لم يوفر لي ، لذلك هناك أي ضمانات تلقائية لهذا؟


لم أكن جذريًا وألغيت الأمر على الفور ، ولكن كان هناك بعض الأذونات المهدرة في مكان ما أو شيء ما لأنني لاحظت أن مطالعتي Bash قد انكسر بالفعل. لا أريد أن أعتمد على الأذونات ولا أكون جذرية (يمكن أن أخطئ في نفس الخطأ sudo) ، ولا أريد البحث عن الأخطاء الغامضة بسبب وجود ملف مفقود في مكان ما في النظام ، لذلك ، sudo جيدة ، لكني أرغب في شيء أفضل لهذه الحالة المحددة.


حول التفكير مرتين واستخدام الدماغ. أنا أستخدمها في الواقع! لكنني أستخدمه لحل بعض مهام البرمجة المعقدة التي تتضمن 10 أشياء مختلفة. أنا منغمسين في هذه المهمة بشكل عميق بما فيه الكفاية ، لا توجد قوة دماغية متبقية لفحص الأعلام والمسارات ، لا أفكر حتى فيما يتعلق بالأوامر والحجج ، أعتقد من حيث الأفعال مثل 'دير الحالي الفارغ' ، جزء مختلف من عقلي يترجمهم إلى الأوامر وأحيانا يرتكب أخطاء. أريد أن يقوم الكمبيوتر بتصحيحها ، على الأقل تلك الخطيرة.


156
2017-12-02 17:09


الأصل


لمعلوماتك ، يمكنك أيضا القيام به rm -rf . /mydir بدلا من rm -rf ./mydir وقتل أي دليل كنت في. أجد هذا يحدث في كثير من الأحيان. - user606723
لاستخدام تشبيه البندقية ، يقول هذا السؤال من فضلك اجعل البندقية تدرك بأنني أهدف إلى قدمي وليس إطلاق النار ، لكنني لا أريد أن أتحمل أي مسؤولية عن عدم استهداف البندقية في قدمي في المقام الأول. البنادق ، والحواسيب ، هي أغبياء وإذا قمت بشيء غبي فستحصل على هذه النتائج. متابعة على طول القياس البندقية ، لا شيء يحميك من إيذاء نفسك إلا اليقظة والممارسة. - slillibri
slillibri فيما عدا ذلك rm ليس بندقية ، بل هو برنامج كمبيوتر ، ذلك استطاع أن يكون ذكياً بما يكفي لتحديد أن المستخدم سيقوم بحذف بعض الملفات الهامة وإصدار تحذير (كما يحدث فعلاً إذا حاولت القيام بذلك rm -rf / بدون نجم). - Valentin Nemcev
slillibri البنادق لديها safeties. طلب كيفية وضع أفضل safeties على rm الأمر هو سؤال مسؤول النظام تماما شرعي. - Gilles
sudo rm / bin / rm غير مستحسن ، ولكن سيمنع معظم جمهورية مقدونيا :-) - 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)

أو

استعمال آمن جمهورية مقدونيا

مقتطفات من موقع الويب:

Safe-rm هي أداة أمان تهدف إلى منع الحذف العرضي   من الملفات الهامة عن طريق استبدال / bin / rm بغطاء ، والذي يتحقق   الحجج المقدمة ضد القائمة السوداء للتكوين من الملفات و   الدلائل التي لا ينبغي إزالتها.

المستخدمون الذين يحاولون حذف أحد هذه الملفات المحمية أو   الدلائل لن تكون قادرة على القيام بذلك وسيتم عرض تحذير   الرسالة بدلاً من ذلك:

$ rm -rf /usr
Skipping /usr

215
2017-12-02 23:36



آمنة-جمهورية مقدونيا تبدو جيدة جداً ، النظر في الأمر الآن ... - Valentin Nemcev
آمن - RM أنيق. أيضا هذا هو خدعة أنيق مع -i ملف. ههه. سحق باش. - EricR
مذهلة ما خداع نوعا ما تتم في يونيكس. - WernerCD
إن ملف الإنشاء المسمى -i هو عبقرية نقية تمامًا. كان بإمكاني استخدام ذلك منذ حوالي عام عندما ركضت عن طريق الخطأ rm -rf / etc / * على VPS ... (لحسن الحظ ، أخذت لقطات ليلية ، لذا استطعت أن أستعيدها في أقل من 45 دقيقة). - David W
إنها عبقرية. سوف يكون السحر touch -- -rf - Mircea Vutcovici


مشكلتك:

أنا فقط ركض rm -rf / * بطريق الخطأ ، لكنني قصدت rm -rf ./* (لاحظ النجم بعد الخط المائل).

الحل: لا تفعل هذا! كمسألة ممارسة ، لا تستخدم ./ في بداية الطريق. لا تضيف الشُرط المائلة أي قيمة إلى الأمر ولن تؤدي إلا إلى حدوث ارتباك.

./*يعني نفس الشيء *، لذلك مكتوب بشكل أفضل الأمر أعلاه على النحو التالي:

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. ومع ذلك ، لا تتوفر هذه الحلول لجميع متغيرات Un * xe وقد لا تعمل على Solaris و FreeBSD و MacOSX. بالاضافة، 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 * في حلقة for والتي تغيرت إلى الدليل الخطأ عن طريق الخطأ وانتهى بحذف شيء آخر. إذا كنت سأستخدم هدفًا محددًا ، فستكون الفرصة أقل بكثير لحذف الخطأ. - richk


بما أن هذا في "Serverfault" ، أود أن أقول هذا:

إذا كان لديك عشرات الخوادم أو أكثر ، مع فريق كبير من المشرفين / المستخدمين ، شخصا ما يتوجه الى rm -rf أو chown الدليل الخطأ.

يجب أن يكون لديك خطة للحصول على الخدمة المتأثرة احتياطيًا باستخدام أقل MTTR محتمل.


30
2017-12-02 20:42



ويجب عليك استخدام جهاز VM أو صندوق احتياطي لممارسة عمليات الاسترداد - اكتشف ما لم ينجح وصقل الخطة المذكورة. إننا نبدأ عملية إعادة التشغيل كل أسبوعين - لأن هناك نفوذاً للطاقة في مبنىنا ، وفي كل مرة كانت مؤلمة. من خلال القيام ببعض الإغلاق المخطط لجميع الحوامل ، قمنا بتقطيعه من بضعة أيام من الركض إلى حوالي 3 ساعات الآن - في كل مرة نتعرف فيها على البتات لأتمتة / تثبيت النصوص البرمجية init.d إلخ. - Danny Staple
وحاول هذا الأمر على VM. إنه شيق! لكن خذ لقطة أولا. - Stefan Lasiewski


تتضمن أفضل الحلول تغيير عاداتك بعدم الاستخدام rm مباشرة.

نهج واحد هو لتشغيل echo rm -rf /stuff/with/wildcards* أول. تحقق من أن الناتج من أحرف البدل يبدو معقولاً ، ثم استخدم سجل shell لتنفيذ الأمر السابق بدون 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 أو أيا كان ، وهذا غير قابل للإلغاء.

يحتوي Zsh على خيارات لمطالبتك قبل تشغيل 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"

يمكنك أيضا دمجها مع عميل تويتر commandline لتنبيه أصدقائك حول كيف كنت تهين نفسك تقريبا عن طريق مسح القرص الثابت الخاص بك مع rm -fr /* كجذر.


18
2017-12-02 17:16



+1 لـ telnet miku.acm.uiuc.edu - Ali
الاسم المستعار echo = "telnet miku.acm.uiuc.edu" - kubanczyk
لا يجب أن أكون في المدرسة القديمة بما فيه الكفاية ... ما هي أهمية telnet miku.acm.uiuc.edu؟ - Kyle Strand
جرب واكتشف. انها غير مدمرة. إذا كنت بجنون العظمة كما يجب أن تكون ، في تشغيل VM. - 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


هناك بعض النصائح السيئة حقا في هذا الموضوع ، لحسن الحظ تم التصويت على معظمها إلى أسفل.

بادئ ذي بدء ، عندما تحتاج إلى أن تكون الجذر ، تصبح الجذر - sudo والحيل المختلفة سيجعلك ضعيفة. والأسوأ من ذلك ، أنهم سوف يجعلونك مهملين. تعلم أن تفعل الأشياء بالطريقة الصحيحة ، توقف عن الاعتماد على الأسماء المستعارة لحمايتك. في أحد الأيام ستحصل على الجذر الذي لا يحتوي على عجلات التدريب الخاصة بك وتفجير شيء ما.

الثانية - عندما يكون لديك جذور ، فكر في نفسك كقيادة حافلة مليئة بأطفال المدارس. في بعض الأحيان ، يمكنك الخروج إلى الأغنية على الراديو ، ولكن في أحيان أخرى تحتاج إلى النظر إلى كلتا الطريقتين ، وتبطئ الأمور ، وتأكد مرة أخرى من جميع المرايا.

الثالث - أنت بالكاد هل حقا يجب أن rm -rf - على الأرجح كنت ترغب في ذلك mv something something.bak أو mkdir _trash && mv something _trash/

الرابعة - دائما ls حرفك قبل rm - لا يوجد شيء مجنون في النظر إلى شيء ما قبل تدميره إلى الأبد.


14
2017-12-02 19:57



+1 للاستخدام ls. - Sachin Divekar
eventi أوافق على أن هناك بعض النصائح الرهيبة والخارقة القبيحين في هذا الموضوع. ومن المؤكد انها فكرة جيدة للنظر في شيء قبل تدميره ، ولكن هناك طريقة أفضل للقيام بذلك باستخدام find أمر. - aculich
لا أستطيع أن أرى كيف يكون البحث أبسط أو أكثر أمانًا ، لكني أحب أسلوبك find . -name '*~' مثال. وجهة نظري هو ذلك ls سوف يسرد نفس الكرة الأرضية ذلك rm سوف نستخدم. - eventi