Solusi 1:
Salah satu trik yang saya ikuti adalah dengan meletakkan #
di awal saat menggunakan rm
perintah.
[email protected]:~# #rm -rf /
Ini mencegah eksekusi rm
yang tidak disengaja pada file/direktori yang salah. Setelah diverifikasi, hapus #
dari awal. Trik ini berhasil, karena di Bash ada kata yang diawali dengan #
menyebabkan kata itu dan semua karakter yang tersisa pada baris itu diabaikan. Jadi perintah diabaikan begitu saja.
ATAU
Jika Anda ingin mencegah direktori penting apa pun, ada satu trik lagi.
Buat file bernama -i
di direktori itu. Bagaimana file aneh seperti itu bisa dibuat? Menggunakan touch -- -i
atau touch ./-i
Sekarang coba rm -rf *
:
[email protected]:~$ touch {1..4}
[email protected]:~$ touch -- -i
[email protected]:~$ ls
1 2 3 4 -i
[email protected]:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'?
Ini *
akan meluaskan -i
ke baris perintah, sehingga perintah Anda akhirnya menjadi rm -rf -i
. Dengan demikian perintah akan meminta sebelum penghapusan. Anda dapat meletakkan file ini di /
Anda , /home/
, /etc/
, dll.
ATAU
Gunakan --preserve-root
sebagai opsi untuk rm
. Di rm
disertakan dalam coreutils
yang lebih baru paket, opsi ini adalah default.
--preserve-root
do not remove `/' (default)
ATAU
Gunakan safe-rm
Kutipan dari situs web:
Safe-rm adalah alat keamanan yang dimaksudkan untuk mencegah penghapusan file penting secara tidak sengaja dengan mengganti /bin/rm dengan pembungkus, yang memeriksa argumen yang diberikan terhadap daftar hitam file dan direktori yang dapat dikonfigurasi yang tidak boleh dihapus.
Pengguna yang mencoba menghapus salah satu dari file atau direktori yang dilindungi ini tidak akan dapat melakukannya dan sebagai gantinya akan diperlihatkan pesan peringatan:
$ rm -rf /usr Skipping /usr
Solusi 2:
Masalah Anda:
Saya baru saja menjalankan rm -rf /* secara tidak sengaja, tetapi maksud saya rm -rf ./* (perhatikan bintang setelah garis miring).
Solusinya:Jangan lakukan itu! Sebagai latihan, jangan gunakan ./
di awal sebuah jalan. Garis miring tidak menambah nilai pada perintah dan hanya akan menyebabkan kebingungan.
./*
artinya sama dengan *
, jadi perintah di atas lebih baik ditulis sebagai:
rm -rf *
Inilah masalah terkait. Saya sering melihat ungkapan berikut, di mana seseorang berasumsi bahwa FOO
diatur ke sesuatu seperti /home/puppies
. Sebenarnya saya baru melihatnya hari ini, dalam dokumentasi dari vendor perangkat lunak besar.
rm -rf $FOO/
Tetapi jika FOO
tidak disetel, ini akan dievaluasi menjadi rm -rf /
, yang akan mencoba menghapus semua file di sistem Anda. Garis miring tidak diperlukan, jadi sebagai latihan jangan gunakan itu.
Berikut ini akan melakukan hal yang sama, dan kecil kemungkinannya untuk merusak sistem Anda:
rm -rf $FOO
Saya telah mempelajari tip-tip ini dengan cara yang sulit. Ketika saya memiliki akun superuser pertama saya 14 tahun yang lalu, saya tidak sengaja menjalankan rm -rf $FOO/
dari dalam skrip shell dan menghancurkan sistem. 4 sysadmin lainnya melihat ini dan berkata, 'Yup. Semua orang melakukannya sekali. Sekarang inilah media instal Anda (36 floppy disk). Ayo perbaiki.'
Orang lain di sini merekomendasikan solusi seperti --preserve-root
dan safe-rm
. Namun, solusi ini tidak tersedia untuk semua varian Un*xe dan mungkin tidak berfungsi pada Solaris, FreeBSD &MacOSX. Selain itu, safe-rm
mengharuskan Anda menginstal paket tambahan pada setiap sistem Linux yang Anda gunakan. Jika Anda mengandalkan safe-rm
, apa yang terjadi jika Anda memulai pekerjaan baru dan mereka tidak memiliki safe-rm
diinstal? Alat-alat ini adalah penopang, dan lebih baik mengandalkan default yang diketahui dan meningkatkan kebiasaan kerja Anda.
Solusi 3:
Karena ini ada di "Serverfault", saya ingin mengatakan ini:
Jika Anda memiliki lusinan atau lebih server, dengan tim admin/pengguna yang besar, seseorang akan menjadi rm -rf
atau chown
direktori yang salah.
Anda harus memiliki rencana untuk mencadangkan layanan yang terpengaruh dengan MTTR seminimal mungkin.
Solusi 4:
Solusi terbaik melibatkan mengubah kebiasaan Anda untuk tidak menggunakan rm
langsung.
Salah satu pendekatannya adalah dengan menjalankan echo rm -rf /stuff/with/wildcards*
pertama. Periksa apakah output dari wildcard terlihat masuk akal, lalu gunakan riwayat shell untuk menjalankan perintah sebelumnya tanpa echo
.
Pendekatan lain adalah dengan membatasi echo
perintah untuk kasus-kasus di mana sangat jelas apa yang akan Anda hapus. Daripada menghapus semua file dalam direktori, hapus direktori dan buat yang baru. Metode yang baik adalah mengganti nama direktori yang ada menjadi DELETE-foo
, lalu buat direktori baru foo
dengan izin yang sesuai, dan terakhir hapus DELETE-foo
. Keuntungan sampingan dari metode ini adalah bahwa perintah yang dimasukkan dalam riwayat 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 bersikeras untuk menghapus banyak file karena Anda memerlukan direktori untuk tetap ada (karena itu harus selalu ada, atau karena Anda tidak memiliki izin untuk membuatnya kembali), pindahkan file ke direktori lain, dan hapus direktori itu .
mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME
(Tekan Alt itu +. kunci.)
Menghapus direktori dari dalam akan menarik, karena rm -rf .
pendek sehingga memiliki risiko kesalahan ketik yang rendah. Sayangnya, sistem tipikal tidak membiarkan Anda melakukan itu. Anda dapat rm -rf -- "$PWD"
sebaliknya, dengan risiko kesalahan ketik yang lebih tinggi tetapi kebanyakan tidak menghasilkan apa-apa. Berhati-hatilah karena ini meninggalkan perintah berbahaya di riwayat shell Anda.
Kapan pun Anda bisa, gunakan kontrol versi. Anda tidak rm
, Anda cvs rm
atau apa pun, dan itu tidak dapat dilakukan.
Zsh memiliki opsi untuk meminta Anda sebelum menjalankan rm
dengan argumen yang mencantumkan semua file dalam direktori:rm_star_silent
(diaktifkan secara default) sebelum menjalankan rm whatever/*
, dan rm_star_wait
(nonaktif secara default) menambahkan penundaan 10 detik saat Anda tidak dapat mengonfirmasi. Ini adalah penggunaan terbatas jika Anda bermaksud menghapus semua file di beberapa direktori, karena Anda sudah mengharapkan prompt. Ini dapat membantu mencegah kesalahan ketik seperti rm foo *
untuk rm foo*
.
Ada banyak lagi solusi yang beredar yang melibatkan perubahan rm
memerintah. Keterbatasan dari pendekatan ini adalah suatu hari Anda akan berada di mesin dengan rm
asli dan Anda akan secara otomatis memanggil rm
, aman dengan harapan Anda akan konfirmasi… dan selanjutnya Anda akan memulihkan cadangan.
Solusi 5:
Anda selalu dapat 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 commandline untuk mengingatkan teman Anda tentang bagaimana Anda hampir mempermalukan diri sendiri dengan menghapus hard disk Anda dengan rm -fr /*
sebagai akar.