Mengapa saya dapat menghapus file read-only?

92

Jika saya membuat file dan kemudian mengubah izinnya 444(hanya baca), bagaimana rmbisa menghapusnya?

Jika saya melakukan ini:

echo test > test.txt
chmod 444 test.txt
rm test.txt

... rmakan bertanya apakah saya ingin menghapus file yang dilindungi tulis test.txt. Saya berharap bahwa rmtidak dapat menghapus file seperti itu dan saya harus melakukan yang chmod +w test.txtpertama. Jika saya melakukannya rm -f test.txtmaka rmakan menghapus file tanpa meminta, meskipun itu hanya baca.

Adakah yang bisa menjelaskan? Saya menggunakan Ubuntu 12.04 / bash.

Magnus
sumber
Klarifikasi: Saya menjalankan perintah ini sebagai pengguna biasa, bukan sebagai root.
Magnus

Jawaban:

104

Semua rmkebutuhan adalah menulis + menjalankan izin pada direktori induk. Izin file itu sendiri tidak relevan.

Berikut adalah referensi yang menjelaskan model izin lebih jelas daripada yang pernah saya bisa:

Upaya apa pun untuk mengakses data file memerlukan izin baca. Setiap upaya untuk memodifikasi data file memerlukan izin tertulis. Upaya apa pun untuk mengeksekusi file (program atau skrip) memerlukan izin eksekusi ...

Karena direktori tidak digunakan dengan cara yang sama seperti file biasa, izin bekerja sedikit (tetapi hanya sedikit) berbeda. Upaya membuat daftar file dalam direktori memerlukan izin baca untuk direktori, tetapi tidak pada file di dalamnya. Upaya untuk menambahkan file ke direktori, menghapus file dari direktori, atau mengubah nama file, semua memerlukan izin tulis untuk direktori, tetapi (mungkin mengejutkan) bukan untuk file di dalamnya. Jalankan izin tidak berlaku untuk direktori (direktori juga tidak bisa menjadi program). Tetapi bit izin itu digunakan kembali untuk direktori untuk tujuan lain.

Jalankan izin diperlukan pada direktori untuk dapat cd ke dalamnya (yaitu, untuk membuat beberapa direktori direktori kerja Anda saat ini).

Jalankan diperlukan pada direktori untuk mengakses informasi "inode" dari file-file di dalamnya. Anda memerlukan ini untuk mencari direktori untuk membaca inode file di dalamnya. Untuk alasan ini izin eksekusi pada direktori sering disebut izin pencarian.

ire_and_curses
sumber
2
Jadi jika saya ingin membuat direktori di mana beberapa file tidak dapat dihapus / diubah tanpa melakukan chmod terlebih dahulu, tetapi yang lain dapat ditulis secara bebas, apakah itu mustahil? Saya harus chmod direktori 555, yang berarti tidak ada file di direktori yang dapat dibuat atau dimodifikasi.
Magnus
3
@ Magnus - Tentu saja, tidak ada yang menghentikan Anda membuat direktori anak yang dapat ditulis di dalam direktori read-only, dan menyimpan file yang dapat ditulis di dalamnya. Direktori anak itu sendiri tidak dapat dihapus, tetapi isinya bisa.
ire_and_curses
7
Tidak bisakah Anda membuat sebuah direktori lengket +tsehingga orang tidak dapat lagi memodifikasi atau menghapus file dalam direktori itu yang tidak mereka miliki walaupun mereka memiliki akses tulis ke direktori?
Shadur
3
@Magnus Jika Anda memiliki akses root (termasuk sudo), Anda dapat menggunakan chattruntuk menambahkan flag yang tidak dapat diubah ke file. Jika tidak, maka ire_and_curses cukup benar.
James O'Gorman
6
Tidak menggunakan rm -f hanya berfungsi selama saya sadar ... ditambah, saya tidak tahu apa yang mungkin atau mungkin tidak dilakukan oleh skrip bash terbelakang
Magnus
53

Oke, menurut komentar Anda pada ire_and_curses, yang benar-benar ingin Anda lakukan adalah membuat beberapa file tidak dapat diubah. Anda dapat melakukannya dengan chattrperintah. Sebagai contoh:

misalnya

$ cd /tmp
$ touch immutable-file
$ sudo chattr +i immutable-file

$ rm -f immutable-file
rm: remove write-protected regular empty file `immutable-file'? y
rm: cannot remove `immutable-file': Operation not permitted

$ mv immutable-file someothername
mv: cannot move `immutable-file' to `someothername': Operation not permitted

$ echo foo > immutable-file 
-bash: immutable-file: Permission denied

Anda tidak dapat melakukan apa pun pada file yang tidak dapat diubah - Anda tidak bisa menghapusnya, mengeditnya, menimpanya, mengganti namanya, chmod atau chown, atau apa pun. Satu-satunya hal yang dapat Anda lakukan dengannya adalah membacanya (jika izin unix memungkinkan) dan (sebagai root) chattr -iuntuk menghapus bit yang tidak dapat diubah.

Tidak semua sistem file mendukung semua atribut. AFAIK, immutable didukung oleh semua sistem file linux yang umum (termasuk ext2 / 3/4 dan xfs. Zfsonlinux tidak mendukung atribut sama sekali saat ini)

cas
sumber
3
itu kadang berguna. btw, bahkan root tidak dapat memodifikasi atau menghapus file yang tidak dapat diubah (bukan tanpa menghapus atribut yang tidak dapat diubah terlebih dahulu) juga btw, gunakan lsattruntuk membuat daftar atribut.
cas
2
+1 - Saya lupa tentang atribut, dan sangat sibuk menjawab pertanyaan literal tentang rmhal ini yang bahkan tidak pernah terpikir oleh saya ...
ire_and_curses
2
Ini adalah filesystem khusus dan ini dapat membawa Anda lebih banyak masalah yang dipecahkan.
Stéphane Gimenez
4
@ Magnus: masalah yang mungkin terjadi termasuk cadangan (tidak semua utilitas cadangan akan membuat cadangan atribut - pada kenyataannya, sebagian besar tidak akan) dan mengembalikan (jika Anda mengembalikan ke direktori yang sudah berisi file abadi, beberapa program akan memperlakukan ketidakmampuan untuk menimpa file itu sebagai kesalahan fatal dan batalkan). Anda juga dapat membuat diri Anda kebingungan jika Anda lupa bahwa Anda membuat file tidak dapat diubah dan tidak tahu mengapa Anda tidak bisa menghapusnya .... pesan kesalahan 'Operasi tidak diizinkan' adalah pesan kesalahan yang sama dengan yang Anda lihat dengan beberapa jenis sistem file korupsi, yang dapat menyebabkan reaksi berlebihan yang berpotensi berbahaya.
cas
1
Anda dapat menyalin (cp) file yang tidak dapat diubah.
Octopus
0

Satu jawaban untuk pertanyaan ini menyatakan bahwa Anda dapat menghapus file dari direktori hanya jika writeizinnya benar-benar salah! Cobalah! Berikan writeizin pada direktori saja dan coba hapus, Anda tidak bisa!
Untuk menghapus file di dalam direktori, Anda memerlukan keduanya writedan executeizin pada direktori

Sekarang kembali ke pertanyaan: untuk menghapus file menggunakan rmAnda hanya menghapus informasi inode-nya dari direktori yaitu Anda bukan shreddingdari disk. Jika informasi inode file tidak ada di direktori Anda tidak dapat mengakses (juga karena Anda tidak dapat melihatnya karena tidak terdaftar oleh direktori induknya) yaitu dihapus untuk Anda.
Dengan demikian untuk menghapus file dari direktori semua yang Anda izin pada direktori; izin pada file itu tidak relevan

Edward Torvalds
sumber