Mengapa Linux / POSIX memiliki lchown tetapi tidak lchmod?

11

Tampaknya Linux mendukung perubahan pemilik tautan simbolik (yaitu lchown) tetapi mengubah mode / izin tautan simbolik (yaitu lchmod) tidak didukung . Sejauh yang saya bisa lihat ini sesuai dengan POSIX. Namun, saya tidak mengerti mengapa orang akan mendukung salah satu dari operasi ini tetapi tidak keduanya. Apa motivasi di balik ini?

Florian Brucker
sumber
1
Izin symlink selalu lrwxrwxrwx. A chmodtidak masuk akal di sini. Mengikuti tautan membawa Anda ke izin target.
ott--
2
@ott: Di Linux, izin symlink selalu yang Anda berikan justru karena Linux tidak mendukung lchmod. Tetapi OS lain yang mirip Unix mendukungnya (mis. Mac OS X ), jadi pertanyaannya adalah mengapa Linux tidak mendukungnya lchown.
Florian Brucker

Jawaban:

9

Linux, seperti kebanyakan sistem mirip Unix (Apple OS / X menjadi salah satu pengecualian yang jarang terjadi), mengabaikan izin pada symlink ketika harus menyelesaikan target mereka misalnya.

Namun kepemilikan symlink, seperti file lain, relevan ketika datang ke izin untuk mengganti nama atau membatalkan tautan entri mereka di direktori yang memiliki tbit set, seperti /tmp.

Untuk dapat menghapus atau mengganti nama file (symlink atau tidak) /tmp, Anda harus menjadi pemilik file. Itulah salah satu alasan seseorang mungkin ingin mengubah kepemilikan symlink (untuk memberikan atau menghapus izin untuk memutuskan tautan / mengubah nama itu).

$ ln -s / /tmp/x
$ rm /tmp/x
# OK removed

$ ln -s / /tmp/x
$ sudo chown -h nobody /tmp/x
$ rm /tmp/x
rm: cannot remove ‘/tmp/x’: Operation not permitted

Juga, seperti yang disebutkan oleh Mark Plotnick dalam jawaban yang sekarang dihapus , aplikasi cadangan dan arsip perlu lchown()mengembalikan symlink ke pemilik aslinya. Pilihan lain adalah mengganti euid dan egid sebelum membuat symlink, tetapi itu tidak akan efisien dan menyulitkan manajemen yang tepat pada direktori tempat symlink diekstraksi.

Stéphane Chazelas
sumber
Saya tidak yakin apakah ini adalah motivasi asli, tetapi memang memberi alasan mengapa desainnya bermanfaat. Terima kasih!
Florian Brucker
0

Tidak ada lchmod () di posix tetapi fchmodat () yang memungkinkan untuk mengatur izin symlink. Ini masih tidak memerlukan izin symlink untuk dievaluasi.

schily
sumber
1
OP tahu tidak memiliki lchmodsesuai dengan POSIX. Apa yang ditambahkan jawaban ini yang belum ada dalam pertanyaan?
muru
Op bertanya mengapa hanya salah satu fungsi yang didukung dan saya menjelaskan bahwa sebenarnya keduanya tersedia, hanya saja tidak dengan nama yang disebutkan.
schily
1
Bagaimana? Standar mengatakan : Beberapa implementasi mungkin memungkinkan mengubah mode tautan simbolik. Ini tidak didukung oleh antarmuka dalam spesifikasi POSIX. Sistem dengan dukungan seperti itu menyediakan antarmuka bernama lchmod (). Untuk mendukung implementasi tersebut, fchmodat () memiliki parameter flag. Semua ini mengatakan bahwa ada flag untuk fchmodat yang memungkinkan implementasi mengubah permisi symlink. Bukan berarti itu bisa.
muru
Benar, karena izin symlink tidak dievaluasi sejak 35 tahun, tidak masuk akal untuk mengubah mode. Fchmodat () ada untuk orthogonslity. Satu-satunya keuntungan nyata adalah futimensat () karena cap waktu yang dapat disetel untuk symlink membantu manusia untuk memahami pohon direktori.
schily
@schilly, OS / X menghargai izin symlinks. Di sana, jika Anda tidak memiliki izin baca, Anda tidak dapat menyelesaikan target mereka.
Stéphane Chazelas