Setelah melakukan kesalahan yang terkenal dengan menghapus seluruh sistem file saya melalui sudo rm -rf /*
, memulihkan dari kerusakan mengerikan yang telah saya lakukan dan mengatasi kenyataan bahwa saya baru saja kehilangan 6 tahun dari masa hidup saya, saya mulai bertanya-tanya mengapa bahkan mungkin untuk melakukan itu, dan apa yang bisa dilakukan untuk mencegah kesalahan ini terjadi.
Salah satu solusi yang disarankan kepada saya adalah mencabut akses root dari akun saya, tetapi itu tidak nyaman, karena banyak perintah memerlukan akses root dan ketika Anda harus menjalankan beberapa lusin perintah setiap hari, itu menjadi menjengkelkan.
Mencadangkan sistem Anda adalah cara yang jelas untuk dilakukan. Tetapi mengembalikan cadangan juga memerlukan beberapa waktu henti, dan tergantung pada sistem Anda bahwa waktu henti itu bisa berhari-hari atau berminggu-minggu, yang mungkin tidak dapat diterima dalam beberapa kasus.
Pertanyaan saya adalah: Mengapa tidak menerapkan konfirmasi ketika pengguna mencoba menghapus sistem file mereka? Sehingga ketika Anda benar-benar ingin melakukan itu, Anda cukup menekan Y atau masuk, dan jika Anda tidak setidaknya Anda tidak kehilangan segalanya.
sumber
/
yang hampir sama buruknya untuk dihapus (/etc/
, misalnya). Ini bukan tugasrm
untuk memutuskan direktori mana yang dapat atau tidak dapat dengan mudah dihapus.Jawaban:
rm
adalah alat sistem tingkat rendah. Alat-alat ini dibangun sesederhana mungkin karena harus ada pada sistem apa pun.rm
diharapkan memiliki perilaku terkenal, terutama yang berkaitan dengan konfirmasi konfirmasi sehingga dapat digunakan dalam skrip.Menambahkan kasus khusus ke prompt
rm /*
tidak akan mungkin karena perintah rm tidak melihatnya dalam formulir ini. The*
wildcard diperluas oleh shell sebelum dilewatkan kerm
, sehingga perintah yang sebenarnya yang membutuhkan kasus khusus akan menjadi sesuatu sepertirm /bin /boot /dev /etc /home /initrd.img /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz
. Menambahkan kode untuk memeriksa kasus ini (yang mungkin akan berbeda pada linux yang berbeda) akan menjadi tantangan yang kompleks serta rentan terhadap kesalahan halus. Linux standarrm
memang memiliki perlindungan default terhadap kerusakan sistem dengan menolak untuk menghapus/
tanpa--no-preserve-root
opsi.Secara default ada tiga perlindungan terhadap penghapusan sistem Anda dengan cara ini:
Untuk menghapus semua isi folder, daripada menjalankan
rm /path/to/folder/*
, lakukanrm -rf /path/to/folder
, makamkdir /path/to/folder
karena ini akan memicu--preserve-root
perlindungan serta menghapus dotfile dalam foldersumber
/
akan membutuhkan banyak kombinasi dan pertimbangan, jadi itu tidak praktis. Dan kembali ke gagasan standar, menambahkan pemeriksaan seperti itu akan merusak perilaku yang konsistensafe-rm
pembungkusrm
: Dengan cara ini ia dapat memeriksa setiap argumen (alih-alih seluruh baris perintah acak), verifikasi itu tidak ada dalam daftar hitam yang dapat dikonfigurasi dan hanya kemudian memanggilrm
dengan argumen yang diverifikasi. Itu tidak terlalu kompleks atau rentan terhadap kesalahan.Meet
safe-rm
, "wrapper around therm
command untuk mencegah penghapusan yang tidak disengaja":Jika tautan instalasi di atas tidak berfungsi untuk Anda gunakan
sudo apt install safe-rm
saja. Konfigurasi default sudah berisi direktori sistem, mari kita cobarm /*
misalnya:Seperti yang Anda lihat, ini akan mencegah Anda menghapus
/home
, di mana saya kira file pribadi Anda disimpan. Namun, itu tidak mencegah Anda menghapus~
atau salah satu subdirektori jika Anda mencoba menghapusnya secara langsung. Untuk menambahkan~/precious_photos
direktori cukup tambahkan path absolutnya dengan tilde diselesaikan kesafe-rm
file konfigurasi/etc/safe-rm.conf
, misalnya:Untuk kasus-kasus di mana Anda menjalankan
rm
tanpasudo
1 dan-f
bendera itu ide yang baik untuk menambahkanalias
untuk shell Anda yang merekrm
's-i
bendera default. Dengan cara inirm
meminta setiap file sebelum menghapusnya:Bendera yang sama bermanfaatnya adalah
-I
, hanya itu hanya memperingatkan "sekali sebelum menghapus lebih dari tiga file, atau ketika menghapus secara rekursif", yang "kurang mengganggu daripada-i
, sambil tetap memberikan perlindungan terhadap sebagian besar kesalahan":Bahaya umum dari alias ini adalah bahwa Anda dengan mudah membiasakan diri untuk menyelamatkan Anda, yang mungkin menjadi bumerang buruk ketika menggunakan lingkungan yang berbeda.
1:
sudo
abaikan alias , satu dapat bekerja di sekitar bahwa dengan mendefinisikanalias sudo='sudo '
meskipunsumber
Konfirmasi sudah ada, masalahnya ada
-f
di perintah, yaitu--force
; Ketika pengguna memaksa operasi, mereka seharusnya tahu apa yang mereka lakukan (jelas kesalahan selalu bisa ditambahkan).Sebuah contoh:
Ini berbeda dengan
--force
opsi: Saya tidak akan mendapatkan konfirmasi dan file dihapus.Masalahnya adalah untuk mengetahui perintah dan parameternya, bernavigasi lebih dalam pada
man
perintah (juga jika perintah ditemukan dalam tutorial) untuk contoh: pertama kali saya melihat perintahtar xzf some.tar.gz
saya bertanya pada diri sendiri, "apaxzf
artinya? "Kemudian saya membaca halaman manual tar dan menemukannya.
sumber
-f
diperlukan untuk menghapus folder. Saya bahkan membuka prompt untuk mengkonfirmasi dan mengeluh tetapi mengetahui bahwa hanya-r
diperlukan. Saya kirarm -rf
telah menjadi norma karena sangat berguna dalam sebuah skrip (Anda tidak ingin skrip gagal hanya karena Anda mencoba menghapus hal-hal yang tidak ada) sehingga Anda sering melihatnya, tetapi saya kira kita perlu untuk waspada hanya menggunakanrm -r
sebagai "default" kami ketika dalam sebuah shell (dapat dimengerti seharusnya tidak ada asumsi "default" yang tidak Anda mengerti, terutama dengan sudo, tetapi orang-orang akan menjadi orang dan setidaknya ini lebih aman).rm
tidak meminta konfirmasi secara default, hanya meminta direktori dan file yang dilindungi tulis. Jika Anda menjalankan perintah itu di komputer Anda, Anda mungkin menghapus banyak file Anda sendiri. Jika Anda perlurm
meminta konfirmasi, Anda harus melewati-i
parameter. Misalnya:rm -ir ./*
Berjalan tanpa cadangan berarti Anda harus sangat berhati-hati untuk tidak pernah melakukan kesalahan. Dan semoga perangkat keras Anda tidak pernah gagal. (Bahkan RAID tidak dapat menyelamatkan Anda dari kerusakan sistem file yang disebabkan oleh RAM yang rusak.) Jadi itulah masalah pertama Anda. (Yang saya anggap sudah Anda sadari dan akan melakukan backup di masa depan.)
Tetapi ada beberapa hal yang dapat Anda lakukan untuk mengurangi kemungkinan kesalahan seperti ini:
rm='rm -I'
untuk meminta jika menghapus lebih dari 3 hal.mv -i
dancp -i
(banyak kasus penggunaan normal untuk ini tidak melibatkan menimpa file tujuan).sudo='sudo '
melakukan ekspansi alias pada argumen pertama kesudo
Saya menemukan
rm -I
jauh lebih bermanfaat daripadarm -i
. Ini biasanya tidak meminta selama penggunaan normal, jadi tetting diminta ketika Anda tidak berharap itu jauh lebih terlihat / peringatan yang lebih baik. Dengan-i
(sebelum saya temukan-I
), saya terbiasa mengetik\rm
untuk menonaktifkan ekspansi alias, setelah yakin saya mengetik perintah dengan benar.Anda tidak ingin terbiasa mengandalkan
rm -i
atau-I
alias untuk menyelamatkan Anda . Itu adalah garis pengaman Anda yang Anda harap tidak pernah digunakan. Jika saya benar-benar ingin secara interaktif memilih yang cocok untuk dihapus, atau saya tidak yakin apakah glob saya cocok dengan beberapa file tambahan, saya mengetik secara manualrm -i .../*whatever*
. (Juga kebiasaan yang baik jika Anda pernah berada di lingkungan tanpa alias Anda).Bertahanlah dari meraba-raba Enterdengan mengetik
ls -d /*foo*
terlebih dahulu , lalu panah atas dan ubah itu menjadirm -r
setelah Anda selesai mengetik. Jadi baris perintah tidak pernah berisirm -rf ~/
atau perintah berbahaya serupa di titik mana pun. Anda hanya "mempersenjatai" itu dengan mengubahls
kerm
dengan kontrol-a, alt-d untuk pergi ke awal baris dan menambahkan-r
atau-f
setelah Anda selesai mengetik~/some/sub/dir/
bagian dari perintah.Bergantung pada apa yang Anda hapus, jalankan yang
ls -d
pertama, atau tidak jika itu tidak menambah apa pun yang Anda lihat dengan penyelesaian-tab. Anda mungkin mulai denganrm
(tanpa-r
atau-rf
) jadi itu hanya control-a / control-right (atau alt + f) / space /-r
.(Biasakan untuk mem-bind / readbind mengedit keybindings kuat untuk bergerak dengan cepat, seperti panah kontrol atau alt + f / b untuk bergerak dengan kata-kata, dan membunuh seluruh kata dengan alt + backspace atau alt + d, atau control-w. Dan kontrol -u untuk membunuh ke awal baris. Dan control- / untuk membatalkan edit jika Anda melangkah terlalu jauh. Dan tentu saja panah atas sejarah yang dapat Anda cari dengan control-r / control-s.)
Hindari
-rf
kecuali Anda benar - benar membutuhkannya untuk membungkam diminta tentang menghapus file read-only.Luangkan waktu ekstra untuk berpikir sebelum menekan return on a
sudo
command. Terutama jika Anda tidak memiliki cadangan lengkap, atau sekarang akan menjadi waktu yang buruk untuk mengembalikannya.sumber
Yah jawaban singkatnya adalah tidak menjalankan perintah seperti itu.
Ceritanya adalah bagian dari penyesuaian. Pada dasarnya ada dua faktor yang berperan di sini. Salah satunya adalah kenyataan bahwa Anda bebas untuk memodifikasi semua file.
Yang kedua adalah bahwa perintah rm menawarkan gula sintaksis yang bermanfaat untuk menghapus semua file di bawah folder.
Secara efektif ini dapat dinyatakan kembali sebagai prinsip sederhana dari mesin Unix. Semuanya adalah file . Untuk membuat masalah lebih baik, ada kontrol akses, tetapi ini ditimpa oleh penggunaan Anda
Saya kira Anda bisa menambahkan alias atau fungsi untuk memastikan bahwa ini tidak pernah dapat dijalankan.
sumber
Jika penggunaan ruang file sistem Anda tidak besar (dan hari ini 'luar biasa' berarti 'ratusan gigabyte atau lebih') buat beberapa mesin virtual, dan selalu bekerja di dalamnya. Pemulihan hanya akan memerlukan menggunakan instance cadangan.
Atau Anda bisa membuat chroot jail, dan bekerja di dalamnya. Anda masih memerlukan beberapa pemulihan jika dibuang, tetapi itu akan lebih mudah dengan sistem yang berjalan (melampirkan) untuk bekerja.
sumber
rm
dengansafe-rm
membantu, setidaknya..project_root
, atau, jika sistem file mendukungnya, atribut pada direktori itu sendiri. Kemudian, skrip akan naik pohon file mencari root proyek, dan mengeluh itu direktori saat ini tidak ada dalam proyek. Atau, jika semua proyek tinggal di tempat yang sama, skrip dapat meminta Anda menyebutkan nama proyek. Anda masih dapat menghapus proyek yang salah, tetapi tidak menghancurkan seluruh sistem.chroot
akan menggunakan sesuatu seperti Docker (yang saya pikir sebenarnya menggunakan dichroot
bawah selimut). Untuk file lain yang hanya perlu Anda baca, pasang sistem file read-only.rm
adalah perintah Unix yang sangat tua dan kemungkinan tidak dirancang dengan ramah pengguna. Ia mencoba melakukan dengan tepat apa yang diminta, ketika ia memiliki izin. Jebakan bagi banyak pengguna baru adalah mereka sering melihat kode dengansudo
dan tidak banyak berpikir tentang menggunakannya. Fungsi yang langsung mengubah file sepertirm
,dd
,chroot
, dll memerlukan perawatan yang ekstrim digunakan.Saat ini saya suka menggunakan
trash
(tanpa sudo) dari trash-cli . Berfungsi seperti Recycle Bin dari Windows, di mana Anda dapat dengan mudah mengambil file yang terhapus secara tidak sengaja. Ubuntu sudah memiliki folder Trash dan fungsionalitas pindah-ke-sampah yang dibangun ke dalam File.Bahkan kemudian Anda mungkin membuat kesalahan jadi pastikan untuk membuat cadangan seluruh sistem file Anda.
sumber