Soru Yanlışlıkla rm -rf / * 'yi nasıl önleyebilirim?


Ben koştum rm -rf /* yanlışlıkla, ama demek istedim rm -rf ./* (çizgiden sonra yıldıza dikkat edin).

alias rm='rm -i' ve --preserve-root varsayılan olarak beni kurtarmadı, bunun için herhangi bir otomatik koruma var mı?


Kök olmadım ve hemen komutu iptal ettim, ama bir yerlerde ya da bir şeyde bazı rahat izinler vardı çünkü Bash komutumun zaten kırıldığını fark ettim. İzinlere güvenmemek ve root olmamaya (aynı hatayı yapabilirim) sudo) ve sistemde bir yerde eksik olan bir dosya yüzünden gizemli hatalar için avlanmak istemiyorum, bu yüzden yedekler ve sudo iyi, ama bu özel durum için daha iyi bir şey isterim.


İki kez düşünmek ve beynini kullanmak hakkında. Aslında kullanıyorum! Ama ben 10 farklı şeyi içeren bazı karmaşık programlama görevini çözmek için kullanıyorum. Bu göreve yeterince kapıldım, bayrak ve patikaları kontrol etmek için herhangi bir beyin gücü kalmadı, komutlar ve argümanlar açısından bile düşünmüyorum, sanırım “boş akım dir” gibi eylemler açısından düşünüyorum, beynimin farklı bir kısmı onları komutlara çevirir ve bazen hata yapar. Bilgisayarın onları düzeltmesini istiyorum, en azından tehlikeli olanları.


156
2017-12-02 17:09


Menşei


FYI, sen de yapabilirsin rm -rf . /mydir yerine rm -rf ./mydir ve bulunduğunuz dizini öldürün. Bunun daha sık olduğunu görüyorum. - user606723
Tabanca benzetmesi kullanmak için bu soru, silahın ayağımı hedeflediğimi ve ateş etmediğimi bildiğine dikkat etse de, silahı ilk etapta ayağımdan çekmemek konusunda herhangi bir sorumluluk almak istemediğimi söylüyor. Silahlar ve bilgisayarlar aptalca ve eğer aptalca bir şey yaparsanız, bu sonuçları alacaksınız. Silah benzetmesi boyunca, hiçbir şey sizi uyanıklık ve uygulama dışında kendinize zarar vermekten alıkoyamaz. - slillibri
@slillibri Bunun dışında rm silah değil, bilgisayar programı. could Kullanıcının bazı önemli dosyaları silmeye ve bir uyarı vereceğine karar vermek için yeterince akıllı olmalısınız (eğer yapmaya çalışırsanız gerçekte olduğu gibi) rm -rf / yıldızsız). - Valentin Nemcev
@slillibri Silahlar güvenlidir. Daha iyi güvenliğin nasıl konulacağını sormak rm Komut, mükemmel bir yasal sysadmin sorusudur. - Gilles
sudo rm / bin / rm tavsiye edilmez, ancak çoğu rm'yi engeller :-) - Paul


Cevaplar:


Takip ettiğim hilelerden biri de # başlangıçta kullanırken rm Komut.

root@localhost:~# #rm -rf /

Bu yanlışlıkla çalıştırılmasını önler rm yanlış dosya / dizin üzerinde. Doğrulandıktan sonra kaldır # başlangıçtan beri. Bu hile işe yarar çünkü Bash’de # Bu kelimenin ve bu satırdaki kalan tüm karakterlerin yok sayılmasına neden olur. Yani komut basitçe göz ardı edilir.

VEYA

Önemli bir dizini önlemek istiyorsanız, bir numara daha var.

Adlı bir dosya oluştur -i bu dizinde. Böyle garip bir dosya nasıl oluşturulabilir? kullanma touch -- -i veya touch ./-i

Şimdi dene 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'? 

İşte * genişleyecek -i komut satırına, böylece komutunuz sonunda olur rm -rf -i. Böylece komut kaldırılmadan önce soracaktır. Bu dosyayı sizin /, /home/, /etc/, vb.

VEYA

kullanım --preserve-root bir seçenek olarak rm. İçinde rm daha yeni dahil coreutils paketleri, bu seçenek varsayılantır.

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

VEYA

kullanım güvenli rm

Web sitesinden alıntı:

Safe-rm, yanlışlıkla silinmeyi önlemek için tasarlanmış bir güvenlik aracıdır.   / bin / rm'yi bir sarmalayıcı ile değiştirerek önemli dosyaların   Yapılandırılabilir bir kara listeye karşı verilen argümanlar ve   asla kaldırılmaması gereken dizinler.

Bu korunan dosyalardan birini silmeye çalışan kullanıcılar veya   dizinler bunu yapamaz ve bir uyarı gösterilecektir   bunun yerine mesaj:

$ rm -rf /usr
Skipping /usr

215
2017-12-02 23:36



safe-rm çok iyi görünüyor, şimdi içine bakıyor ... - Valentin Nemcev
safe-rm düzgün. Ayrıca bu şık bir hile ile -i dosya. Hah. Aptal bash. - EricR
Unix'te ne tür bir hile yapıldığı şaşırtıcı. - WernerCD
-İ adlı oluşturma dosyası kesinlikle saf dehadır. Yaklaşık bir yıl önce VPS'de bir rm -rf / etc / * çalıştırdığım zaman bunu kullanabildim ... (Neyse ki, gece çekimlerini alıyorum, bu yüzden 45 dakikadan daha kısa bir sürede geri yükleme yapabildim). - David W
Bu dahidir. Büyücülük olurdu touch -- -rf - Mircea Vutcovici


Senin sorunun:

Ben sadece rm -rf / * koştum, ama ben rm -rf ./* demek istedim.

Çözüm: Bunu yapma! Pratik olarak kullanmayın ./ bir yolun başında. Eğik çizgiler, komuta hiçbir değer katmaz ve sadece karışıklığa neden olur.

./*aynı şey anlamına gelir *Yani yukarıdaki komut şöyle yazılır:

rm -rf *

İşte ilgili bir problem. Aşağıdaki ifadeyi sık sık görüyorum; FOO gibi bir şey olarak ayarlandı /home/puppies. Bunu sadece bugün, büyük bir yazılım satıcısından alınan belgelerde gördüm.

rm -rf $FOO/

Ama eğer FOO ayarlanmadı, bu değerlendirir rm -rf /, sisteminizdeki tüm dosyaları kaldırmaya çalışacaktır. Sondaki eğik çizgi gereksizdir, dolayısıyla bir uygulama meselesi kullanmadığı için.

Aşağıdakiler aynı şeyi yapacak ve sisteminizi bozma olasılığı daha az olacaktır:

rm -rf $FOO

Bu ipuçlarını zor yoldan öğrendim. İlk süper kullanıcı hesabımı 14 yıl önce kazandığımda, yanlışlıkla koştum. rm -rf $FOO/ bir kabuk komut dosyasından ve bir sistemi yok etti. Diğer 4 sysadmins buna baktı ve şöyle dedi: 'Yup. Bunu herkes bir kez yapar. Şimdi kurulum ortamınız (36 disket). Git, düzelt.

Buradaki diğer kişiler, --preserve-root ve safe-rm. Ancak, bu çözümler tüm Un * xe değişkenleri için mevcut değildir ve Solaris, FreeBSD ve MacOSX üzerinde çalışmayabilir. Ek olarak, safe-rm Kullandığınız her Linux sistemine ek paketler yüklemenizi gerektirir. Eğer güvenirsen safe-rm, yeni bir işe başladığınızda ne olur ve onlar yok safe-rm Kurulmuş? Bu araçlar bir koltuk değneği ve bilinen varsayılanlara güvenmek ve çalışma alışkanlıklarınızı geliştirmek için daha iyidir.


42
2017-12-02 18:58



Arkadaşım bana hiç kullanmadığını söyledi rm -rf *. Her zaman dizini değiştirir ve belirli bir hedef kullanır. Bunun nedeni, kabuğun tarihini çok kullanması ve tarihine böyle bir komuta sahip olmanın yanlış zamanda ortaya çıkabileceğinden endişe duymaktadır. - haggai_e
@haggai_e: İyi bahşiş. Unix’e yeniyken, bir keresinde bir hatayla karşılaştım. rm -rf * ayrıca kaldırıldı . ve ... Köküyüm ve bu aşağıdakine benzer alt dizinlere ../../..ve oldukça yıkıcıydı. Çok dikkatli olmaya çalışıyorum rm -rf * o zamandan beri. - Stefan Lasiewski
rm -rf $FOO ihtiyacınız varsa yardım etmeyecek rm -rf $FOO/$BAR. cd $FOO && rm -rf $BAR daha uzun olmasına rağmen, yardımcı olacaktır. - Victor Sergienko
@VictorSergienko, bash ile nasıl belirtilir ${FOO:?}, de olduğu gibi rm -rf ${FOO:?}/ ve rm -rf ${FOO:?}/${BAR:?}. Şimdiye kadar tercüme etmesini engelleyecek rm -rf /. Cevabımla ilgili daha fazla bilgiye sahibim İşte. - A-B-B
@haggai_e: Bu konuyla ilgili en iyi tavsiyelerinden birini buluyorum. Parmağımı kullanarak yaktım rm -rf * Yanlış bir dizine yanlışlıkla dönüşen ve başka bir şeyi silen sona eren bir for döngüsünde. Belirli bir hedef kullanmış olsaydım, yanlış şeyi silmek için çok daha küçük bir şans olurdu. - richk


Bu "Serverfault" da olduğundan, şunu söylemek isterim:

Büyük bir sunucu / kullanıcı grubuyla düzinelerce veya daha fazla sunucunuz varsa, birisi gidiyor rm -rf veya chown yanlış dizin.

Etkilenen hizmeti mümkün olan en az MTTR ile geri almak için bir planınız olmalıdır.


30
2017-12-02 20:42



Ve geri kazanımları uygulamak için bir VM veya yedek kutu kullanmalısınız - ne işe yaramadığını ve planın hassaslaştırıldığını öğrenin. İki haftada bir yeniden başlatmaya giriyoruz - çünkü binalarımızda güç çıkışı var ve her seferinde acı vericiydi. Tüm rafların birkaç planlı kapanmasını yaparak, yaklaşık 3 saatten yaklaşık 3 saate varan bir kesinti yaptık - her seferinde init.d komut dosyalarını otomatikleştirmek / düzeltmek için hangi bitleri öğrendiğimizi. - Danny Staple
Ve bu komutu bir VM'de deneyin. İlginç! Ama önce bir fotoğraf çek. - Stefan Lasiewski


En iyi çözümler alışkanlıklarınızı değiştirmemeyi içerir. rm direkt olarak.

Bir yaklaşım koşmaktır echo rm -rf /stuff/with/wildcards* ilk. Joker karakterlerin çıktısının makul göründüğünü kontrol edin, daha sonra kabuğun geçmişini kullanarak önceki komutu yürütmek için kullanın. echo.

Başka bir yaklaşım sınırlamaktır echo Silmekte olduğunuz şeyi açıkça belli eden durumlara komut verin. Dizindeki tüm dosyaları kaldırmak yerine, dizini kaldırın ve yeni bir tane oluşturun. Varolan dizini yeniden adlandırmak iyi bir yöntemdir. DELETE-foove sonra yeni bir dizin oluştur foo uygun izinler ile ve sonunda kaldır DELETE-foo. Bu yöntemin bir yan yararı, tarihinize girilen komutun 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

Bir grup dosyayı silme konusunda gerçekten ısrar ederseniz, kalabilmek için dizine ihtiyacınız var (çünkü her zaman var olmalı ya da yeniden oluşturma iznine sahip olamayacağınız için), dosyaları farklı bir dizine taşıyın ve bu dizini silin. .

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

(Buna vur Alt+. Anahtar.)

İçeriden bir dizinin silinmesi çekici olacaktır çünkü rm -rf . kısa bir nedenle düşük bir yazım hatası riski vardır. Tipik sistemler, maalesef bunu yapmanıza izin vermez. Yapabilirsin rm -rf -- "$PWD" bunun yerine, daha yüksek bir yazım hatası riskiyle birlikte, bunların çoğu hiçbir şeyi kaldırmaya götürmez. Bu, kabuk geçmişinizde tehlikeli bir komut bıraktığından emin olun.

Ne zaman yapabilirsen, sürüm kontrolünü kullan. Yapmıyorsun rm, sen cvs rm ya da her neyse, bu geri alınamaz.

Zsh çalıştırmadan önce size sormak için seçenekleri vardır rm dizindeki tüm dosyaları listeleyen bir argümanla: rm_star_silent (varsayılan olarak) yürütmeden önce ister rm whatever/*, ve rm_star_wait (varsayılan olarak kapalı), onaylayamadığınız 10 saniyelik bir gecikme ekler. Bu, bazı dizinde bulunan tüm dosyaları kaldırmayı amaçlamışsanız sınırlı bir kullanımdır, çünkü zaten istemini bekliyor olacaksınız. Yazım hatalarını önlemeye yardımcı olabilir rm foo * için rm foo*.

Etrafında yüzen birçok daha fazla çözüm vardır rm Komut. Bu yaklaşımın bir kısıtlaması, bir gün gerçek bir makinede olacağınızdır. rm ve otomatik olarak arayacaksınız rmDoğrulama isteğiniz için güvenli ve bir dahaki sefere yedekleri geri yükleyeceksiniz.


23
2017-12-02 22:33



mv -t DELETE_ME -- * biraz daha kusursuz. - Tobu
@Giles Kullanmıyor rm doğrudan iyi bir tavsiye! Daha da iyi bir alternatif ise kullan find komuta. - aculich
Kalan dizine ihtiyacınız varsa, bunu oldukça basit bir şekilde yapabilirsiniz. find somedir -type f -delete içindeki tüm dosyaları silecek somedir ancak dizini ve tüm alt dizinleri bırakacaktır. - aculich


Bahsettiğin gibi, her zaman bir takma isim yapabilirsin:

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"

Ayrıca sabit diskinizi silerek neredeyse kendinizi nasıl küçük düşürdüğünüzü arkadaşlarınıza uyarmak için bir komut satırı twitter istemcisi ile entegre edebilirsiniz. rm -fr /* kök olarak.


18
2017-12-02 17:16



Telnet için +1 miku.acm.uiuc.edu - Ali
alias echo = "telnet miku.acm.uiuc.edu" - kubanczyk
Yeterince yaşlı olmamalıyım ... önemi nedir? telnet miku.acm.uiuc.edu? - Kyle Strand
Deneyin ve öğrenin. Bu yıkıcı değil. Olmanız gerektiği kadar paranoyaksanız, bir VM'de çalıştırın. - Naftuli Kay
-1 Komutları boşluk bırakarak bunlara izin veremezsiniz / * geçersiz bir isim - xenithorb


Evet: Kök olarak çalışmayın ve her zaman harekete geçmeden önce iki kez düşünün.

Ayrıca, şuna benzer bir şeye https://launchpad.net/safe-rm.


15
2018-02-26 05:50



Düzenlemede root olarak bahsedildi - Valentin Nemcev
@Valentin: o_O !! - Jonathan Rioux


Yanlışlıkla önlenmenin en kolay yolu rm -rf /* tüm kullanımından kaçınmaktır rm Komut! Aslında, her zaman koşmak için cazip oldum rm /bin/rm Komutadan tamamen kurtulmak için! Hayır, yüzsüz değilim.

Bunun yerine -delete seçeneği find komutaancak önce dosyaları silmeden önce, hangi dosyaları sileceğinizin önizlemesini öneririm:

find | less

Not, modern sürümlerinde find Bir dizinin adını çıkarırsanız, geçerli dizini dolaylı olarak kullanır, dolayısıyla yukarıdakiler buna eşdeğerdir:

find . | less

Bunları silmek istediğiniz dosya olduklarından emin olduktan sonra -delete seçeneği:

find path/to/files -delete

Yani sadece find  kullanmak daha güvenli, aynı zamanda daha anlamlıBu nedenle, belirli bir kalıpla eşleşen bir dizin hiyerarşisindeki yalnızca belirli dosyaları silmek istiyorsanız, önizlemek için bu şekilde bir ifade kullanabilirsiniz, ardından dosyaları silin:

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

Öğrenmek ve kullanmak için pek çok iyi neden var find sadece daha güvenli rmBu yüzden, kullanmayı öğrenmek için zaman ayırırsanız, daha sonra kendinize teşekkür edersiniz. find.


15
2017-12-03 22:44



Çok ilginç bir tartışma. Yaklaşımını beğendim ve küçük bir pasaj yaptım. En fazla 3 kez buldukları için çok verimsiz, ama benim için bu güzel bir başlangıç: github.com/der-Daniel/fdel - Daniel Hitzel