Files

如何使符號連結只讀(chattr +i /location/symlink)?

  • July 8, 2020

我們如何鎖定符號連結使其無法刪除?

使用普通文件/目錄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_NOFOLLOWO_NOPATH符號連結,但前者本身將失敗ELOOP,後者將返回一個不能與 . 一起使用的文件描述符ioctl

引用自:https://unix.stackexchange.com/questions/586430