Files如何使符號連結只讀(
如何使符號連結只讀(chattr +i /location/symlink
)?
我們如何鎖定符號連結使其無法刪除?
使用普通文件/目錄
chattr +i /file/location
可以實現這一點,但使用符號連結我們會得到chattr: Operation not supported while reading flags on my-file
.有一個類似的問題,How to set
chattr +i
for my/etc/resolv.conf
? ,但沒有可以在這裡應用的解決方案。
這沒有提供解決方案,但它解釋了為什麼
chattr
不能使符號連結不可變。在 Linux 上,不可變屬性是一組標誌的一部分,這些標誌使用
FS_IOC_SETFLAGS
ioctl
. 從歷史上看,這首先在 ext2 中實現,並且chattr
它本身仍然是e2fsprogs
. 當它嘗試檢索標誌時,在設置它們之前,chattr
明確檢查它正在處理的文件是正常文件還是目錄:if (!lstat(name, &buf) && !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) { goto notsupp; }
有人可能會認為刪除這些檢查,或將它們更改為允許符號連結,將是允許使符號連結不可變的良好的第一步
chattr
,但隨後立即出現下一個障礙:fd = open (name, OPEN_FLAGS); if (fd == -1) return -1; r = ioctl (fd, EXT2_IOC_GETFLAGS, &f);
ioctl
對文件描述符進行操作,這意味著必須先打開目標,然後才能設置其標誌。無法打開符號連結以使用ioctl
; 雖然open
支持O_NOFOLLOW
和O_NOPATH
符號連結,但前者本身將失敗ELOOP
,後者將返回一個不能與 . 一起使用的文件描述符ioctl
。