שאלה כיצד ניתן למנוע מקרי 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 הפקודה היא שאלה לגיטימית לחלוטין sysadmin. - Gilles
sudo rm / bin / rm לא מומלץ, אבל ימנע ביותר של rm Youנות - Paul


תשובות:


אחד הטריקים שאני עוקב אחריו הוא לשים # בהתחלה תוך שימוש rm פקודה.

root@localhost:~# #rm -rf /

זה מונע ביצוע מקריים של rm על הקובץ הלא נכון / ספרייה. לאחר האימות, הסר # מההתחלה. הטריק הזה עובד, כי בשא מילה מתחיל עם # גורם למילה זו ולכל התווים הנותרים בשורה זו להתעלם. אז פשוט להתעלם פקודה.

או

אם אתה רוצה למנוע ספרייה חשובה, יש עוד טריק אחד.

צור קובץ בשם -i בספרייה זו. כיצד ניתן ליצור קובץ מוזר כזה? שימוש touch -- -i או touch ./-i

עכשיו תנסה rm -rf *You

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

קטע מתוך האתר:

Safe-rm הוא כלי בטיחות שנועד למנוע את המחיקה בשוגג   של קבצים חשובים על ידי החלפת / bin / rm עם מעטפת, אשר בודק   את הארגומנטים נתון נגד רשימה שחורה להגדרה של קבצים   ספריות כי אף פעם לא צריך להיות מוסר.

משתמשים המנסים למחוק אחד מהקבצים המוגנים האלה או   הספריות לא יוכלו לעשות זאת ותוצג אזהרה   הודעה:

$ rm -rf /usr
Skipping /usr

215
2017-12-02 23:36



בטוח- rm נראה טוב מאוד, להסתכל לתוך זה עכשיו ... - Valentin Nemcev
בטוח- rm הוא מסודר. גם זה טריק nifty עם -i קובץ. חה. טיפשי. - EricR
מדהים מה trickery kinda נעשה יוניקס. - WernerCD
יצירת הקובץ בשם -i הוא גאון טהור לחלוטין. הייתי יכול להשתמש בו לפני כשנה כאשר אני בטעות רץ rf-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

למדתי את הטיפים האלה בדרך הקשה. כאשר היה לי חשבון superuser הראשון שלי לפני 14 שנים, אני בטעות רץ rm -rf $FOO/ מתוך סקריפט פגז והרס מערכת. ארבעת המנהלים האחרים הביטו בו ואמרו,'כן. כולם עושים את זה פעם אחת. עכשיו הנה שלך להתקין מדיה (36 תקליטונים). לכו לתקן את זה.

אנשים אחרים כאן ממליצים על פתרונות כמו --preserve-root ו safe-rm. עם זאת, פתרונות אלה אינם קיימים עבור כל * xe-varients ולא יכול לעבוד על Solaris, FreeBSD & MacOSX. בנוסף, safe-rm דורש שתתקין חבילות נוספות בכל מערכת Linux שבה אתה משתמש. אם אתה מסתמך על 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, עם bash, מה לגבי מפרט ${FOO:?}, כמו ב rm -rf ${FOO:?}/ ו rm -rf ${FOO:?}/${BAR:?}. זה ימנע ממנה אי פעם לתרגם rm -rf /. יש לי עוד מידע על כך בתשובה שלי כאן. - A-B-B
@haggai_e: אני מוצא את זה אחד הייעצים הטובים ביותר בנושא זה. שרפתי את האצבע שלי באמצעות rm -rf * ב לולאה אשר השתנה לספרייה הלא נכונה בטעות ובסופו של דבר מחיקת משהו אחר. אם הייתי משתמש מטרה מסוימת זה היה סיכוי הרבה יותר קטן למחוק את הדבר הלא נכון. - richk


מאז זה על "Serverfault", אני רוצה לומר את זה:

אם יש לך עשרות או יותר שרתים, עם צוות גדול של מנהלי / משתמשים, מישהו הוא הולך rm -rf או chown הספרייה הלא נכונה.

אתה צריך תוכנית להשגת שירות מושפע לגבות עם MTTR לפחות האפשרי.


30
2017-12-02 20:42



ואתה צריך להשתמש VM או תיבת חילוף להתאמן להתאושש - לגלות מה לא עובד לחדד תוכנית אמר. אנחנו נכנסים לאתחול דו-שבועי - כי היו לנו תחנות כוח בבניין שלנו, ובכל פעם שזה כואב. על ידי ביצוע כמה כיבוי המתוכנן של כל המדפים, אנחנו כבר לחתוך אותו כמה ימים של ריצה סביב כ 3 שעות עכשיו - בכל פעם שאנחנו לומדים איזה סיביות כדי להפוך / לתקן script.Id init.d וכו ' - Danny Staple
ונסה את הפקודה על VM. זה מעניין! אבל לקחת תמונה הראשונה. - 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

(פגע בזה Alt+. מפתח.)

מחיקת ספריה מבפנים תהיה אטרקטיבית, כי 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"

אתה יכול גם לשלב את זה עם לקוח twitter הפקודה כדי להודיע ​​לחברים שלך על איך אתה כמעט מושפל עצמך על ידי ניגוב הדיסק הקשיח שלך עם rm -fr /* כמו שורש.


18
2017-12-02 17:16



+1 עבור telnet miku.acm.uiuc.edu - Ali
כינוי הד = "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
@Valentin: o_O !! - 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


זה תקן שלי במיוחד עבור regexps בהקשר של rm, אבל זה היה מציל אותך במקרה זה.

אני תמיד עושה echo foo*/[0-9]*{bar,baz}* תחילה, כדי לראות מה תהיה ההתאמה הרצויה. ברגע שיש לי את הפלט, אז אני חוזר עם שורת הפקודה ולשנות echo ל rm -rf. אני לעולם, אי פעם להשתמש rm -rf על regexp לא נבדק.


11
2017-12-02 19:05



השווה: /ux3/regex.3.php  אתר האינטרנט של - bukzor
בסדר, מה אני מחפש? האם אתה עושה את הצבע כי תחביר regexp עבור התאמת הקובץ שונה (ולפעמים נקרא על ידי שם אחר) מן המשמשים למשל פרל? או נקודה אחרת שאני החמצתי? אני מתנצל על איטיות המחשבה שלי, זה הדבר הראשון בשבת בבוקר! - MadHatter
הדברים האלה שאתה קורא "regexp" הם למעשה globs. זה לא תחביר שונה של רגקס; זה לא regex. - bukzor
טיעון זה בהחלט יכול להתבצע; עם זאת, מתוך מאמר wikipedia על ביטויים רגולריים, אני מוצא כי "מערכות מחשוב מודרניות רבות מספקות תווים כלליים בשמות קבצים תואמים ממערכת קבצים, זוהי יכולת הליבה של פגזי שורת פקודה רבים הידועה גם בשם" globing "- שים לב השימוש "הידוע גם בשם", אשר נראה לי לציין כי אסימונים קורא המכיל metacharacters כדי להתאים אחד או יותר שמות קבצים regexps אינו טועה. אני מסכים כי globing הוא מונח טוב יותר כי זה לא אומר שום דבר אחר מאשר השימוש בביטויים רגולריים בשמות הקובץ. - MadHatter
@MadHatter בדיקה כדי לראות מה הקבצים להתאים לפני שאתה למחוק אותם היא עצה טובה, אבל יש בטוחה ובטוחה יותר לעשות את זה עם find פקודה. - aculich


הפתרון לבעיה זו הוא לקחת גיבויים קבועים. בכל פעם שאתה לייצר משהו שאתה לא רוצה להסתכן לאבד, לגבות את זה. אם אתה מוצא גיבוי קבוע הוא כואב מדי, ואז לפשט את התהליך, כך שזה לא כואב.

לדוגמה, אם אתה עובד על קוד המקור, השתמש בכלי כמו git כדי לשקף את הקוד ולשמור את ההיסטוריה על מכונה אחרת. אם אתה עובד על מסמכים, יש סקריפט זה rsyncs המסמכים שלך למכונה אחרת.


9
2017-12-03 23:02



העתק על מערכת קבצים כגון btrfs יכול לעזור גם כן. אתה יכול בקלות להגדיר פשוט סיבוב אוטומטי סיבוב הפועל מקומית (בנוסף גיבוי חיצוני). - malthe