jawaban baraboom dan peth keduanya benar: Bit izin pada tautan simbolik itu sendiri tidak relevan (kecuali pada MacOS; lihat di bawah), dan mengubah izin pada tautan simbolik - dengan chmod
alat baris perintah atau melalui chmod()
panggilan sistem - hanya akan bertindak sebagai jika itu dilakukan terhadap target tautan simbolik.
Mengutip deskripsi SUSv4 / POSIX.1-2008 tentang panggilan sistem symlink () :
Nilai bit mode file untuk tautan simbolik yang dibuat tidak ditentukan. Semua antarmuka yang ditentukan oleh POSIX.1-2008 akan berperilaku seolah-olah isi dari tautan simbolik selalu dapat dibaca, kecuali bahwa nilai bit mode file yang dikembalikan dalam bidang st_mode dari struktur stat tidak ditentukan.
Di sini, "tidak ditentukan" menyisakan ruang interpretasi untuk setiap implementasi. Spesifik:
- Di Linux (diuji menggunakan ext4fs),
stat()
kembali st_mode=0777
, tidak peduli apa umask itu ketika symlink dibuat; ls -l
karena itu selalu ditampilkan lrwxrwxrwx
untuk tautan simbolik.
- Pada macOS (HFS) dan FreeBSD (baik UFS dan ZFS), tautan simbolik memang memiliki izinnya sendiri:
chmod -h
Perintah yang disebutkan di atas dapat mengubah izin tautan ini (yang secara internal menggunakan lchown()
pemanggilan sistem non-POSIX untuk mencapai hal ini), dan stat()
sistem panggilan mengembalikan nilai ini untuk st_mode
.
Tautan simbolik di Linux dan FreeBSD selalu dapat diikuti, seperti yang ditentukan oleh POSIX. Khususnya, pada FreeBSD, ini berarti bahwa mode file dari tautan simbolik sama sekali tidak berpengaruh pada kontrol akses.
Di sisi lain, macOS sedikit merusak POSIX. Meskipun tautan simbolis dapat diikuti tanpa izin baca, readlink()
gagal dengan EACCES
(Izin ditolak) jika pengguna tidak memiliki izin baca:
$ sudo ln -shf target symlink
$ sudo chmod -h 444 symlink
$ ls -l symlink
lr--r--r-- 1 root staff 1 Mar 14 13:05 symlink -> target
$ sudo chmod -h 000 symlink
$ ls -l symlink
ls: symlink: Permission denied
l--------- 1 root staff 1 Mar 14 13:05 symlink
$ echo kthxbye > target
$ cat symlink
kthxbye
(Perhatikan bahwa -> target
bagian tersebut tidak ada dalam output dari ls -l
perintah kedua , dan itu cat symlink
masih berhasil dan mencetak isi target
file meskipun pengguna tidak memiliki izin baca symlink
.)
NetBSD rupanya menawarkan opsi pemasangan khusus symperm
yang dinamai , yang jika disetel, menyebabkan tautan simbolik membaca / mengeksekusi izin untuk mengontrol readlink()
dan menautkan traversal.