Pertanyaan Bagaimana cara mencegah rm -rf / * disengaja tidak disengaja?


Saya baru saja berlari rm -rf /* tanpa sengaja, tapi maksud saya rm -rf ./* (perhatikan bintang setelah garis miring).

alias rm='rm -i' dan --preserve-root secara default tidak menyelamatkan saya, jadi adakah pengaman otomatis untuk ini?


Saya tidak root dan membatalkan perintah segera, tetapi ada beberapa izin rileks di suatu tempat atau sesuatu karena saya melihat bahwa prompt Bash saya sudah rusak. Saya tidak ingin mengandalkan izin dan tidak menjadi root (saya bisa membuat kesalahan yang sama dengan sudo), dan saya tidak ingin mencari bug misterius karena satu file yang hilang di suatu tempat di sistem, jadi, backup dan sudo bagus, tapi saya ingin sesuatu yang lebih baik untuk kasus khusus ini.


Tentang berpikir dua kali dan menggunakan otak. Saya menggunakannya sebenarnya! Tapi saya menggunakannya untuk menyelesaikan beberapa tugas pemrograman rumit yang melibatkan 10 hal yang berbeda. Saya tenggelam dalam tugas ini cukup dalam, tidak ada kekuatan otak yang tersisa untuk memeriksa bendera dan jalur, saya bahkan tidak berpikir dalam hal perintah dan argumen, saya pikir dalam hal tindakan seperti 'kosong saat ini dir', bagian otak saya yang berbeda menerjemahkannya ke perintah dan kadang-kadang membuat kesalahan. Saya ingin komputer memperbaiki mereka, setidaknya yang berbahaya.


156
2017-12-02 17:09




FYI, Anda juga bisa melakukannya rm -rf . /mydir dari pada rm -rf ./mydir dan bunuh direktori apa pun yang Anda gunakan. Saya menemukan ini terjadi lebih sering. - user606723
Untuk menggunakan analogi senjata, pertanyaan ini mengatakan tolong buat pistol mengenali bahwa saya membidik kaki saya dan bukan api, tetapi saya tidak ingin memiliki tanggung jawab untuk tidak mengarahkan pistol di kaki saya di tempat pertama. Senjata, dan komputer, bodoh dan jika Anda melakukan hal yang bodoh maka Anda akan mendapatkan hasil ini. Mengikuti analogi pistol, tidak ada yang menghalangi Anda untuk menyakiti diri sendiri kecuali kewaspadaan dan latihan. - slillibri
@slillibri Kecuali itu rm bukan senjata, itu adalah program komputer, itu bisa cukup pintar untuk menentukan bahwa pengguna akan menghapus beberapa file penting dan mengeluarkan peringatan (seperti yang sebenarnya dilakukan jika Anda mencoba melakukannya rm -rf / tanpa bintang). - Valentin Nemcev
@slillibri Guns memiliki safeties. Bertanya bagaimana cara memasang safeties yang lebih baik di rm perintah adalah pertanyaan sysadmin yang sah. - Gilles
sudo rm / bin / rm tidak direkomendasikan, tetapi akan mencegah sebagian besar rm :-) - Paul


Jawaban:


Salah satu trik yang saya ikuti adalah menempatkan # di awal saat menggunakan rm perintah.

root@localhost:~# #rm -rf /

Ini mencegah eksekusi yang tidak disengaja rm pada direktori file / yang salah. Setelah diverifikasi, hapus # dari awal. Trik ini berfungsi, karena dalam kata Bash diawali dengan # menyebabkan kata itu dan semua karakter yang tersisa pada baris itu diabaikan. Jadi, perintah itu diabaikan begitu saja.

ATAU

Jika Anda ingin mencegah direktori penting, ada satu trik lagi.

Buat file bernama -i di direktori itu. Bagaimana bisa file aneh seperti itu dibuat? Menggunakan touch -- -i atau touch ./-i

Sekarang coba 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'? 

Di sini * akan berkembang -i ke baris perintah, sehingga perintah Anda akhirnya menjadi rm -rf -i. Dengan demikian perintah akan meminta sebelum penghapusan. Anda dapat menyimpan file ini di file Anda /, /home/, /etc/, dll.

ATAU

Menggunakan --preserve-root sebagai opsi untuk rm. Dalam rm termasuk dalam yang lebih baru coreutils paket, opsi ini adalah default.

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

ATAU

Menggunakan aman-rm

Kutipan dari situs web:

Safe-rm adalah alat keamanan yang dimaksudkan untuk mencegah penghapusan tidak disengaja   file penting dengan mengganti / bin / rm dengan pembungkus, yang memeriksa   argumen yang diberikan terhadap daftar hitam file yang dapat dikonfigurasi dan   direktori yang tidak boleh dihapus.

Pengguna yang mencoba untuk menghapus salah satu dari file yang dilindungi ini atau   direktori tidak akan dapat melakukannya dan akan diperlihatkan peringatan   pesan sebagai gantinya:

$ rm -rf /usr
Skipping /usr

215
2017-12-02 23:36



safe-rm terlihat sangat bagus, melihat ke dalamnya sekarang ... - Valentin Nemcev
safe-rm rapi. Juga itu trik yang bagus dengan -i mengajukan. Hah Bash konyol. - EricR
Sungguh menakjubkan apa yang dilakukan oleh tipuan di unix. - WernerCD
File pembuatan bernama -i benar-benar genius murni. Saya bisa menggunakannya sekitar setahun yang lalu ketika saya tidak sengaja menjalankan rm -rf / etc / * pada VPS ... (untungnya, saya mengambil foto-foto malam, jadi bisa mengembalikannya dalam waktu kurang dari 45 menit). - David W
Itu jenius. Sihir akan menjadi touch -- -rf - Mircea Vutcovici


Masalahmu:

Saya hanya berlari rm -rf / * tanpa sengaja, tapi saya maksudkan rm -rf ./* (perhatikan bintang setelah garis miring).

Solusinya: Jangan lakukan itu! Sebagai soal latihan, jangan gunakan ./ di awal jalan. Garis miring tidak menambah nilai pada perintah dan hanya akan menyebabkan kebingungan.

./*berarti hal yang sama *, jadi perintah di atas lebih baik ditulis sebagai:

rm -rf *

Inilah masalah terkait. Saya sering melihat ungkapan berikut, di mana seseorang mengasumsikan hal itu FOO diatur ke sesuatu seperti /home/puppies. Saya melihat ini hanya hari ini sebenarnya, dalam dokumentasi dari vendor perangkat lunak utama.

rm -rf $FOO/

Tapi jika FOO tidak disetel, ini akan dievaluasi rm -rf /, yang akan berusaha menghapus semua file di sistem Anda. Trailing slash tidak diperlukan, jadi praktis tidak menggunakannya.

Hal berikut ini akan melakukan hal yang sama, dan kecil kemungkinannya untuk merusak sistem Anda:

rm -rf $FOO

Saya telah mempelajari kiat-kiat ini dengan cara yang sulit. Ketika saya memiliki akun superuser pertama saya 14 tahun yang lalu, saya tidak sengaja berlari rm -rf $FOO/ dari dalam skrip shell dan menghancurkan sistem. Empat sysadmin lainnya melihat ini dan berkata, 'Yup. Setiap orang melakukannya sekali. Sekarang inilah media instal Anda (36 floppy disk). Pergi perbaiki. '

Orang lain di sini merekomendasikan solusi seperti --preserve-root dan safe-rm. Namun, solusi ini tidak ada untuk semua Un * xe-varients dan mungkin tidak berfungsi pada Solaris, FreeBSD & MacOSX. Sebagai tambahan, safe-rm mengharuskan Anda menginstal paket tambahan pada setiap sistem Linux tunggal yang Anda gunakan. Jika Anda mengandalkan safe-rm, apa yang terjadi ketika Anda memulai pekerjaan baru dan mereka tidak punya safe-rm diinstal? Alat-alat ini adalah penopang, dan itu jauh lebih baik untuk mengandalkan standar yang diketahui dan meningkatkan kebiasaan kerja Anda.


42
2017-12-02 18:58



Teman saya mengatakan kepada saya bahwa dia tidak pernah menggunakannya rm -rf *. Dia selalu mengubah direktori terlebih dahulu, dan menggunakan target tertentu. Alasannya adalah bahwa ia banyak menggunakan sejarah cangkang, dan ia khawatir bahwa memiliki perintah seperti itu dalam sejarahnya mungkin akan muncul pada saat yang salah. - haggai_e
@haggai_e: Kiat bagus. Ketika saya baru di Unix, saya berlari satu kali ke bug di mana rm -rf * juga dihapus . dan ... Saya adalah root, dan ini melintasi direktori yang lebih rendah seperti ../../.., dan cukup merusak. Saya berusaha sangat berhati-hati rm -rf * semenjak. - Stefan Lasiewski
rm -rf $FOO tidak akan membantu jika Anda perlu rm -rf $FOO/$BAR. cd $FOO && rm -rf $BAR akan membantu, meskipun itu lebih lama. - Victor Sergienko
@VictorSergienko, dengan bash, bagaimana menentukannya ${FOO:?}, seperti dalam rm -rf ${FOO:?}/ dan rm -rf ${FOO:?}/${BAR:?}. Ini akan mencegahnya dari yang pernah diterjemahkan ke dalam rm -rf /. Saya memiliki beberapa info lebih lanjut tentang ini dalam jawaban saya sini. - A-B-B
@haggai_e: Saya menemukan ini salah satu saran terbaik tentang topik ini. Saya membakar jari saya dengan menggunakan rm -rf * dalam for loop yang diubah ke direktori yang salah karena kesalahan dan akhirnya menghapus sesuatu yang lain. Jika saya akan menggunakan target tertentu, itu akan memiliki kesempatan yang jauh lebih kecil untuk menghapus hal yang salah. - richk


Karena ini ada di "Serverfault", saya ingin mengatakan ini:

Jika Anda memiliki lusinan atau lebih server, dengan tim admin / pengguna yang sangat besar, some one akan rm -rf atau chown direktori yang salah.

Anda harus memiliki rencana untuk mengembalikan layanan yang terpengaruh dengan MTTR seminimal mungkin.


30
2017-12-02 20:42



Dan Anda harus menggunakan VM atau kotak cadangan untuk mempraktikkan pemulihan - cari tahu apa yang tidak berhasil dan perbaiki rencana tersebut. Kami akan melakukan reboot setiap dua minggu - karena ada kekuatan berlebih di gedung kami, dan setiap kali itu terasa menyakitkan. Dengan melakukan beberapa shutdown yang direncanakan dari semua rak, kami telah memotongnya dari beberapa hari berjalan sekitar 3 jam sekarang - setiap kali kami mempelajari bit mana untuk mengotomatisasi / memperbaiki skrip init.d untuk dll. - Danny Staple
Dan coba perintah ini pada VM. Ini menarik! Tetapi ambil foto terlebih dahulu. - Stefan Lasiewski


Solusi terbaik melibatkan mengubah kebiasaan Anda untuk tidak digunakan rm langsung.

Satu pendekatan adalah lari echo rm -rf /stuff/with/wildcards* pertama. Periksa apakah output dari wildcard terlihat masuk akal, kemudian gunakan sejarah shell untuk mengeksekusi perintah sebelumnya tanpa echo.

Pendekatan lain adalah membatasi echo perintah untuk kasus di mana itu sangat jelas apa yang akan Anda hapus. Daripada menghapus semua file dalam direktori, hapus direktori dan buat yang baru. Metode yang bagus adalah mengganti nama direktori yang ada menjadi DELETE-foo, lalu buat direktori baru foo dengan izin yang sesuai, dan akhirnya menghapus DELETE-foo. Manfaat sampingan dari metode ini adalah bahwa perintah yang dimasukkan dalam sejarah Anda adalah 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

Jika Anda benar-benar ingin menghapus banyak file karena Anda memerlukan direktori untuk tetap (karena harus selalu ada, atau karena Anda tidak memiliki izin untuk membuatnya kembali), pindahkan file ke direktori yang berbeda, dan hapus direktori tersebut .

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

(Pukul itu Alt+. kunci.)

Menghapus direktori dari dalam akan menarik, karena rm -rf . singkat maka memiliki risiko rendah kesalahan ketik. Sistem yang tipikal tidak membiarkan Anda melakukan itu, sayangnya. Anda bisa melakukannya rm -rf -- "$PWD" sebagai gantinya, dengan risiko kesalahan ketik yang lebih tinggi tetapi kebanyakan dari mereka menyebabkan tidak ada yang dihapus. Berhati-hatilah bahwa ini meninggalkan perintah berbahaya dalam sejarah shell Anda.

Kapan pun Anda bisa, gunakan kontrol versi. Kamu tidak rm, kamu cvs rm atau apa pun, dan itu undoable.

Zsh memiliki opsi untuk meminta Anda sebelum menjalankan rm dengan argumen yang mencantumkan semua file dalam direktori: rm_star_silent (diaktifkan secara default) meminta sebelum mengeksekusi rm whatever/*, dan rm_star_wait (dinonaktifkan secara default) menambahkan jeda 10 detik di mana Anda tidak dapat mengonfirmasi. Ini adalah penggunaan terbatas jika Anda bermaksud untuk menghapus semua file di beberapa direktori, karena Anda akan mengharapkan perintah sudah. Ini dapat membantu mencegah kesalahan ketik rm foo * untuk rm foo*.

Ada banyak solusi yang beredar yang melibatkan perubahan rm perintah. Batasan dari pendekatan ini adalah bahwa suatu hari Anda akan berada di mesin dengan yang asli rm dan Anda akan secara otomatis menelepon rm, aman dalam harapan Anda akan konfirmasi ... dan selanjutnya Anda akan memulihkan cadangan.


23
2017-12-02 22:33



mv -t DELETE_ME -- * sedikit lebih mudah dibasmi. - Tobu
@Giles Tidak menggunakan rm langsung adalah saran yang bagus! Alternatif yang lebih baik adalah menggunakan find perintah. - aculich
Dan jika Anda membutuhkan direktori untuk tetap Anda dapat melakukannya dengan cukup sederhana dengan menggunakan find somedir -type f -delete yang akan menghapus semua file di somedir tetapi akan meninggalkan direktori dan semua subdirektori. - aculich


Anda selalu bisa melakukan alias, seperti yang Anda sebutkan:

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"

Anda juga dapat mengintegrasikannya dengan klien twitter baris perintah untuk mengingatkan teman Anda tentang bagaimana Anda hampir mempermalukan diri sendiri dengan menghapus hard disk dengan rm -fr /* sebagai root.


18
2017-12-02 17:16



+1 untuk telnet miku.acm.uiuc.edu - Ali
alias echo = "telnet miku.acm.uiuc.edu" - kubanczyk
Saya tidak harus cukup tua-sekolah ... apa pentingnya telnet miku.acm.uiuc.edu? - Kyle Strand
Cobalah dan cari tahu. Itu tidak merusak. Jika Anda paranoid seperti seharusnya, jalankan dalam VM. - Naftuli Kay
-1 Anda tidak dapat melakukan perintah alias dengan spasi di dalamnya apalagi / * yang merupakan nama yang tidak valid - xenithorb


Ya: Jangan bekerja sebagai root dan selalu berpikir dua kali sebelum bertindak.

Juga, lihatlah sesuatu seperti https://launchpad.net/safe-rm.


15
2018-02-26 05:50



Disebutkan bekerja sebagai root dalam pengeditan - Valentin Nemcev
@Valentin: o_O !! - Jonathan Rioux


Cara termudah untuk mencegah kecelakaan rm -rf /* adalah untuk menghindari semua penggunaan rm perintah! Bahkan, saya selalu tergoda untuk berlari rm /bin/rm untuk menyingkirkan perintah sepenuhnya! Tidak, aku tidak bercanda.

Sebagai gantinya gunakan -delete opsi dari find perintah, tetapi sebelum menghapus file yang saya sarankan untuk mempratinjau file apa yang akan Anda hapus:

find | less

Perhatikan, dalam versi modern find jika Anda meninggalkan nama direktori, secara implisit akan menggunakan direktori saat ini, sehingga di atas adalah setara dengan:

find . | less

Setelah Anda yakin ini adalah file yang ingin Anda hapus, Anda dapat menambahkannya -delete pilihan:

find path/to/files -delete

Jadi, bukan hanya itu find  lebih aman digunakan, juga lebih ekspresif, jadi jika Anda ingin menghapus hanya file tertentu dalam hierarki direktori yang cocok dengan pola tertentu, Anda dapat menggunakan ekspresi seperti ini untuk mempratinjau, lalu hapus file:

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

Ada banyak alasan bagus untuk dipelajari dan digunakan find selain hanya lebih aman rm, jadi Anda akan berterima kasih pada diri Anda nanti jika Anda meluangkan waktu untuk belajar menggunakannya find.


15
2017-12-03 22:44



Diskusi yang sangat menarik. Saya suka pendekatan Anda dan membuat sedikit cuplikan. Ini sangat tidak efisien, karena panggilannya menemukan paling banyak 3 kali, tetapi bagi saya ini adalah awal yang bagus: github.com/der-Daniel/fdel - Daniel Hitzel


Ada beberapa saran yang benar-benar buruk di thread ini, untungnya sebagian besar telah ditolak.

Pertama-tama, ketika Anda harus menjadi root, menjadi root - sudo dan berbagai alias trik akan membuat Anda lemah. Dan lebih buruk lagi, mereka akan membuat Anda ceroboh. Belajar untuk melakukan hal-hal dengan cara yang benar, berhenti bergantung pada alias untuk melindungi Anda. Suatu hari Anda akan mendapatkan root pada kotak yang tidak memiliki roda pelatihan dan meledakkan sesuatu.

Kedua - ketika Anda memiliki akar, pikirkan diri Anda sebagai mengendarai bus penuh anak-anak sekolah. Kadang-kadang Anda dapat mengguncang lagu di radio, tetapi kali lain Anda perlu melihat ke dua arah, memperlambat segalanya, dan memeriksa ulang semua cermin Anda.

Ketiga - Anda hampir tidak pernah sangat harus rm -rf - lebih mungkin kamu mau mv something something.bak atau mkdir _trash && mv something _trash/

Keempat - selalu ls wildcard Anda sebelumnya rm - Tidak ada yang gila dalam melihat sesuatu sebelum menghancurkannya selamanya.


14
2017-12-02 19:57



+1 untuk penggunaan ls. - Sachin Divekar
@eventi Saya setuju bahwa ada beberapa saran yang buruk dan peretasan yang buruk di utas ini. Dan itu jelas ide yang baik untuk melihat sesuatu sebelum menghancurkannya, tetapi ada cara yang lebih baik untuk melakukan itu menggunakan find perintah. - aculich
Saya gagal melihat bagaimana menemukan lebih sederhana atau lebih aman, tapi saya suka Anda find . -name '*~' contoh. Maksud saya adalah itu ls akan mencantumkan glob yang sama itu rm akan menggunakan. - eventi


Ini adalah standar saya khusus untuk regexps dalam konteks rm, tetapi itu akan menyelamatkan Anda dalam kasus ini.

aku selalu melakukan echo foo*/[0-9]*{bar,baz}* pertama, untuk melihat apa yang akan cocok dengan regexp. Setelah saya memiliki output, saya kemudian kembali dengan mengedit dan mengubah baris perintah echo untuk rm -rf. saya tidak pernah digunakan rm -rf pada regexp yang belum diuji.


11
2017-12-02 19:05



Silakan bandingkan: linuxmanpages.com/man3/regex.3.php  linuxmanpages.com/man3/glob.3.php - bukzor
OK, apa yang saya cari? Apakah Anda membuat titik bahwa sintaks regexp untuk pencocokan file berbeda (dan kadang-kadang disebut dengan nama yang berbeda) dari yang digunakan dalam misalnya perl? Atau beberapa hal lain yang saya lewatkan? Saya mohon maaf atas kelambatan pemikiran saya, ini adalah hal pertama Sabtu pagi di sini! - MadHatter
Hal-hal yang Anda sebut "regexp" ini sebenarnya glob. Ini bukan sintaks regex yang berbeda; itu bukan regex. - bukzor
Argumen itu tentu bisa dibuat; Namun, dari artikel wikipedia pada ekspresi reguler, saya menemukan bahwa "Banyak sistem komputasi modern menyediakan karakter wildcard dalam mencocokkan nama file dari sistem file. Ini adalah kemampuan inti dari banyak shell command-line dan juga dikenal sebagai globbing" - perhatikan penggunaan "juga dikenal sebagai", yang bagi saya untuk menunjukkan bahwa token panggilan yang mengandung metakarakter untuk mencocokkan satu atau lebih nama file regexps tidak salah. Saya setuju bahwa globbing adalah istilah yang lebih baik karena tidak berarti apa-apa selain penggunaan ekspresi reguler dalam pencocokan nama file. - MadHatter
@MadHatter Memeriksa untuk melihat file apa yang cocok sebelum Anda menghapusnya adalah saran yang bagus, tetapi ada a cara lebih aman dan lebih ekspresif untuk melakukannya dengan find perintah. - aculich


Solusi untuk masalah ini adalah dengan mengambil backup secara teratur. Setiap kali Anda menghasilkan sesuatu yang Anda tidak ingin mengambil risiko kehilangan, mendukungnya. Jika Anda menemukan cadangan secara teratur terlalu menyakitkan, maka sederhanakanlah prosesnya sehingga tidak menyakitkan.

Misalnya, jika Anda bekerja pada kode sumber, gunakan alat seperti git untuk mencerminkan kode dan menyimpan riwayat di komputer lain. Jika Anda mengerjakan dokumen, miliki skrip itu rsyncs dokumen Anda ke komputer lain.


9
2017-12-03 23:02



Sebuah filesystem copy-on-write seperti btrfs dapat membantu juga. Anda dapat dengan mudah mengatur rotasi snapshot otomatis sederhana yang berjalan secara lokal (selain cadangan eksternal). - malthe


Sepertinya cara terbaik untuk mengurangi risiko ini adalah memiliki penghapusan dua tahap seperti kebanyakan GUI. Yaitu, ganti rm dengan sesuatu yang memindahkan sesuatu ke direktori sampah (pada volume yang sama). Kemudian bersihkan sampah itu setelah cukup waktu berlalu untuk melihat kesalahan apa pun.

Salah satu utilitas tersebut, trash-cli, dibahas di Unix StackExchange, sini.


6
2017-12-02 17:15



Ini adalah hal pertama yang saya instal di setiap mesin. Ini harus menjadi alat penghapusan default, dengan rm hanya digunakan ketika Anda harus benar-benar menghapus sesuatu sekarang. Saya sedih karena belum diambil, tetapi suatu hari nanti akan hilang. Mungkin setelah contoh yang sangat umum dari rm menyebabkan masalah besar yang tidak bisa ditangani oleh backup. Mungkin sesuatu di mana waktu yang dibutuhkan untuk pulih memainkan faktor yang sangat besar. - Gerry
+1 Setelah menggunakan linux selama 20 tahun, saya masih berpikir harus ada semacam perilaku sampah-untuk rm. - Shovas