Bagaimana mencegah rm -rf yang salah untuk folder tertentu?

8

Saya pikir cukup banyak orang di sini keliru ' rm -rf' direktori salah, dan mudah-mudahan itu tidak menyebabkan kerusakan besar .. Apakah ada cara untuk mencegah pengguna melakukan kisah horor unix serupa ?? Seseorang menyebutkan (di bagian komentar di tautan sebelumnya ) itu

... Saya cukup yakin sekarang setiap kursus atau perusahaan unix yang menggunakan set unix rm -fr untuk menonaktifkan akun orang yang mencoba menjalankannya atau menghentikan mereka menjalankannya ...

Apakah ada implementasi itu di distro Unix atau Linux saat ini? Dan apa praktik umum untuk mencegah kesalahan itu bahkan dari sysadmin (dengan akses root)?

Tampaknya ada beberapa perlindungan untuk direktori root ( /) di Solaris (sejak 2005) dan GNU (sejak 2006). Apakah ada juga untuk menerapkan cara perlindungan yang sama ke beberapa folder lain juga ??

Untuk memberikan kejelasan lebih lanjut, saya tidak bertanya tentang saran umum tentang rmpenggunaan (dan saya telah memperbarui judul untuk menunjukkan lebih banyak), saya ingin sesuatu yang lebih seperti perlindungan folder root: agar rm -rf /Anda harus melewati parameter tertentu: rm -rf --no-preserve-root /.. Apakah ada implementasi yang serupa untuk direktori yang dikustomisasi? Atau bisakah saya menentukan file selain untuk /dilindungi oleh opsi preserve-root ?

amyassin
sumber
11
1) Ubah manajemen 2) Cadangan.
mattdm
6
mungkin satu-satunya cara adalah mengganti rmperintah dengan yang tidak memiliki fitur itu.
Keith
2
safe-rm mungkin
sr_
2
kebanyakan distro melakukan `alias rm = 'rm -i' yang membuat rm bertanya apakah Anda yakin. selain itu: tahu apa yang kamu lakukan hanya menjadi root jika perlu. untuk setiap pengguna dengan hak akses root, keamanan apa pun harus diterapkan di dan oleh pengguna. merekrut seseorang jika Anda tidak dapat melakukannya sendiri. Dari waktu ke waktu tindakan pencegahan apa pun menjadi sama dengan garis alias di atas jika Anda tidak dapat membungkus kepala Anda sendiri di sekitar masalah.
Bananguin
1
@amyassin using rm -rfdapat menjadi acara pembuatan resume. Periksa dan cek tiga kali sebelum menjalankannya
midnightsteel

Jawaban:

15

Untuk menghindari kesalahan rm -rf, jangan mengetikrm -rf .

Jika Anda perlu menghapus pohon direktori, saya sarankan alur kerja berikut:

  • Jika perlu, ubah ke induk direktori yang ingin Anda hapus.
  • mv directory-to-delete DELETE
  • Jelajahi DELETEdan periksa apakah memang itu yang ingin Anda hapus
  • rm -rf DELETE

Jangan pernah panggil rm -rfdengan argumen selain DELETE. Melakukan penghapusan dalam beberapa tahap memberi Anda kesempatan untuk memverifikasi bahwa Anda tidak menghapus hal yang salah, baik karena kesalahan ketik (seperti dalam rm -rf /foo /barbukan rm -rf /foo/bar) atau karena braino (oops, tidak, saya bermaksud menghapus foo.olddan menyimpan foo.new) .

Jika masalah Anda adalah Anda tidak bisa memercayai orang lain untuk tidak mengetik rm -rf, pertimbangkan untuk menghapus hak admin mereka. Ada banyak lagi yang bisa salah daripada rm.


Selalu buat cadangan .

Verifikasi secara berkala bahwa cadangan Anda berfungsi dan terbaru.

Simpan segala sesuatu yang tidak dapat dengan mudah diunduh dari suatu tempat di bawah kontrol versi.


Dengan sistem unix dasar, jika Anda benar-benar ingin membuat beberapa direktori tidak terhapus oleh rm, ganti (atau bayangan yang lebih baik) rmdengan skrip khusus yang menolak argumen tertentu. Atau oleh hg rm.

Beberapa varian unix menawarkan lebih banyak kemungkinan.

  • Pada OSX, Anda dapat menetapkan daftar kontrol akses pada direktori yang mencegah penghapusan file dan subdirektori di dalamnya, tanpa mencegah pembuatan entri baru atau modifikasi entri yang ada: chmod +a 'group:everyone deny delete_child' somedir(ini tidak mencegah penghapusan file di subdirektori: jika Anda ingin itu, atur ACL pada subdirektori juga).
  • Di Linux, Anda dapat menetapkan aturan dalam SELinux, AppArmor atau kerangka kerja keamanan lainnya yang melarang rmuntuk memodifikasi direktori tertentu.
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ya mencadangkan adalah solusi yang paling luar biasa, tetapi saya memikirkan sesuatu seperti --no-preserve-rootopsi, untuk folder penting lainnya .. Dan itu tampaknya tidak ada bahkan sebagai praktik ...
amyassin
Saya telah mengedit pertanyaan untuk menunjukkan apa yang saya inginkan lagi ...
amyassin
1
@amyassin Saya khawatir tidak ada yang lebih (paling tidak di Linux). rm -rfsudah berarti "hapus ini, ya saya yakin saya tahu apa yang saya lakukan". Jika Anda menginginkan lebih, ganti rmdengan skrip yang menolak untuk menghapus direktori tertentu.
Gilles 'SANGAT berhenti menjadi jahat'
Harap edit komentar terakhir untuk pertanyaan ini karena saya pikir itu menjawab pertanyaan dengan baik ...
amyassin
2
@amyassin Sebenarnya, saya mengambil ini kembali. Tidak ada yang lebih pada Linux tradisional, tetapi Anda dapat mengatur aturan Apparmor / SELinux / ... yang mencegah rmmengakses direktori tertentu. Juga, karena pertanyaan Anda bukan hanya tentang Linux, saya seharusnya menyebutkan OSX, yang memiliki sesuatu yang sedikit seperti yang Anda inginkan.
Gilles 'SO- stop being evil'
4

Jika Anda menggunakan rm *dan zsh, Anda dapat mengatur opsi rmstarwait:

setopt rmstarwait

Sekarang shell memperingatkan ketika Anda menggunakan *:

> zsh -f
> setopt rmstarwait
> touch a b c
> rm *
zsh: sure you want to delete all the files in /home/unixuser [yn]? _

Ketika Anda menolaknya ( n), tidak ada yang terjadi. Kalau tidak, semua file akan dihapus.

qbi
sumber
Untuk apa zsh -fdigunakan?
James
3

Untuk melindungi dari kecelakaan rm -rf *dalam direktori, buat file bernama "-i" (Anda dapat melakukan ini dengan emacs atau program lain) di direktori itu. Shell akan mencoba menafsirkan -i dan akan menyebabkannya masuk ke mode interaktif.

Misalnya: Anda memiliki direktori bernama rmtestdengan file bernama -iinside. Jika Anda mencoba rmsegala sesuatu di dalam direktori, rmpertama-tama akan -iditeruskan ke sana dan akan masuk ke mode interaktif. Jika Anda meletakkan file seperti itu di dalam direktori yang ingin Anda proteksi, mungkin membantu.

Perhatikan bahwa ini tidak efektif terhadap rm -rf rmtest.

Pedagang perak
sumber
Saya telah mengedit pertanyaan untuk menunjukkan apa yang saya inginkan lagi ...
amyassin
Trik yang luar biasa! File ini mudah dibuat dengan> -i
capitano666
2

EDIT seperti yang disarankan oleh komentar:

Anda dapat mengubah atribut untuk mengubah file atau direktori dan kemudian tidak dapat dihapus bahkan oleh root sampai atribut dihapus.

chattr +i /some/important/file

Ini juga berarti bahwa file tidak dapat ditulis atau diubah dengan cara apa pun , bahkan oleh root . Atribut lain yang tampaknya tersedia yang belum saya gunakan adalah atribut append ( chattr +a /some/important/file. Kemudian file hanya dapat dibuka dalam mode append, artinya tidak ada penghapusan juga, tetapi Anda dapat menambahkannya (katakan file log). Ini berarti Anda tidak akan dapat mengeditnya vimmisalnya, tetapi Anda dapat melakukannya echo 'this adds a line' >> /some/important/file. Menggunakan >alih-alih >>akan gagal.

Atribut ini dapat tidak disetel menggunakan tanda minus, yaitu chattr -i file

Kalau tidak, jika ini tidak cocok, satu hal yang saya praktekkan adalah selalu ls /some/dirterlebih dahulu, dan alih-alih mengetik ulang perintah, tekan panah CTL-A, lalu hapus lsdan ketik saya rm -rfjika saya membutuhkannya. Tidak sempurna, tetapi dengan melihat hasil ls, Anda tahu sebelumnya apakah itu yang Anda inginkan.

Drake Clarris
sumber
Saya telah mengedit pertanyaan untuk menunjukkan apa yang saya inginkan lagi ...
amyassin
2

Jika Anda mengerti bahasa pemrograman C, saya pikir mungkin untuk menulis ulang kode sumber rm dan membuat sedikit patch untuk kernel. Saya melihat ini di satu server dan tidak mungkin untuk menghapus beberapa direktori penting dan ketika Anda mengetik 'rm -rf / direcotyr' itu mengirim email ke sysadmin.

ValeriRangelov
sumber
1

Salah satu pilihan yang mungkin adalah berhenti menggunakan rm -rfdan mulai menggunakan rm -ri. iParameter tambahan ada untuk memastikan bahwa ia bertanya apakah Anda yakin Anda ingin menghapus file.

Mungkin taruhan terbaik Anda adalah rm -rimemasukkan sesuatu yang berkesan kill_it_with_fire. Dengan cara ini setiap kali Anda ingin mengeluarkan sesuatu, teruskan dan bunuh dengan api.

NlightNFotis
sumber
1
Saya suka namanya, tetapi bukankah fitu kebalikan dari iopsi ?? Saya mencobanya dan bekerja ...
amyassin
@amyassin Ya itu. Untuk beberapa jenis busana yang aneh, saya pikir saya hanya punya rdi sana. Perbaiki saja.
NlightNFotis
Saya telah mengedit pertanyaan untuk menunjukkan apa yang saya inginkan lagi ...
amyassin
-1

Saya suka menempatkan nama direktori terlebih dahulu seperti ini:

$ rm /directoryname -rf
kieranwild
sumber
5
ini melanggar pedoman POSIX.
gelraen
Saya telah mengedit pertanyaan untuk menunjukkan apa yang saya inginkan lagi ...
amyassin