Kenapa satu pengguna dapat menghapus 755 file pengguna lain?

35

Saya memiliki skrip unggah cadangan yang menyimpan file scp ke server lain menggunakan pengguna upload. Script lain di server target kemudian chown ini untuk pengguna lain dan mengatur mode file ke 755.

Jika saya kemudian SSH ke server target menggunakan uploadpengguna, saya dapat menghapus file yang di-chedd. Bukankah seharusnya mereka dibaca saja?

Berikut adalah tampilan file di server target, dan pengguna uploaddapat menghapusnya.

-rwxr-xr-x 1 maciekish maciekish 650M Nov  1 01:07 2014-11-01-data.tar.bz2

Pengguna uploadbaru saja ditambahkan menggunakan useradddan bukan bagian dari maciekishgrup.

Ketika mencoba untuk menghapus file uploadmelalui ssh saya mendapatkan pertanyaan apakah saya ingin menghapus "tulis file biasa yang dilindungi" dan saya bisa mengatakan Ydan menghapusnya.

Maciej Swic
sumber
4
Pada dasarnya, duplikat dari Mengapa bisa rmmenghapus file read-only?
G-Man Mengatakan 'Reinstate Monica'

Jawaban:

64

File - file ini hanya bisa dibaca; namun, menghapus file tidak memodifikasinya tetapi hanya direktori induk (pada dasarnya menghapus file dari daftar direktori) - dan sepertinya Anda memiliki izin menulis penuh ke direktori.

Anda dapat mengatur stickybit — alias "penghapusan terbatas" - yang akan mencegah siapa pun kecuali pemiliknya mengubah nama atau menghapus file dalam direktori tersebut (seperti dalam /tmp). Untuk melakukan ini, jalankan chmod o+t *directory*sebagai pemilik direktori.

grawity
sumber
12

Dalam sistem file Unix yang khas, file apa pun dapat diidentifikasi dengan jumlah entri direktori yang sewenang-wenang, yang masing-masing berisi "tautan keras".

Dari sudut pandang implementasi ada perbedaan antara menghapus entri direktori terakhir (hard link) untuk file dan hanya menghapus satu referensi dari banyak. Namun, dari sudut pandang semantik tidak ada perbedaan.

Jika ada banyak tautan keras ke suatu file, menulis ke file menggunakan salah satu di antaranya mengubah file yang dilihat oleh mereka semua. rmNamun, menggunakan tautan hanya menyebabkan file tidak dapat diakses melalui tautan itu. Tautan lain ke file terus melihat file yang sama persis.

supercat
sumber
3
Umumnya dikenal sebagai tautan keras.
Bob
1
@ Bob: Saya tahu istilah "tautan keras" digunakan untuk menjelaskan referensi yang dibuat ke file yang sudah ada; dalam kasus di mana file tidak pernah memiliki lebih dari satu referensi untuk itu, apakah satu-satunya referensi masih disebut "tautan keras"?
supercat
3
Tidak ada perbedaan antara tautan. Buat file A, buat hard link B, hapus file A. Apakah B sekarang file atau hard link? Untuk memahami cara kerjanya, lebih baik melihatnya sebagai tautan keras N dan bukan sebagai 1 berkas dan tautan (N-1). Ada juga tautan yang ada saat file dibuka.
gnasher729
@ gnasher729: Saya setuju bahwa dalam kasus di mana banyak tautan ada atau telah ada di suatu file, masuk akal untuk menyebut semuanya sebagai "tautan keras" jika tidak ada perbedaan semantik di antara mereka. Di sisi lain, saya akan berpikir bahwa baik dari sudut pandang semantik dan kinerja mungkin ada keuntungan untuk membedakan antara entri direktori yang selalu menjadi satu-satunya referensi ke file, dibandingkan dengan yang mana tautan keras lain mungkin telah dibuat. Bagaimanapun, saya tidak tahu apakah akan benar untuk merujuk katakan tentang entri direktori, "yang masing-masing disebut 'hard link'".
supercat
2
@ supercat itu tidak terlalu umum, tetapi itu benar. Pertimbangkan bidang st_nlink("jumlah tautan keras") di struct stat. Sederhananya, direktori menyimpan tautan keras ke file.
hobbs