int*_*ika 5 ext4 symlink files xattr delete
我们如何锁定符号链接以使其无法被删除?
使用普通的文件/目录chattr +i /file/location可以实现这一点,但是使用符号链接来实现这一点,我们得到chattr: Operation not supported while reading flags on my-file。
还有一个类似的问题,如何为我的“/etc/resolv.conf”设置“chattr +i”?,但没有可以应用于此处的解决方案。
这并没有提供解决方案,但它解释了为什么chattr可以使符号链接不可变。
在 Linux 上,不可变属性是一组标志的一部分,这些标志使用FS_IOC_SETFLAGS ioctl. 从历史上看,这是首先在 ext2 中实现的,并且chattr它本身仍然是e2fsprogs. 当它尝试检索 flags时,在设置它们之前,chattr显式检查 it\xe2\x80\x99s 处理的文件是否是常规文件或目录:
if (!lstat(name, &buf) &&\n !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {\n goto notsupp;\n }\nRun Code Online (Sandbox Code Playgroud)\n人们可能认为删除这些检查,或者更改它们以允许符号链接,将是允许符号链接不可变的良好第一步chattr,但此后立即出现下一个障碍:
fd = open (name, OPEN_FLAGS);\n if (fd == -1)\n return -1;\n r = ioctl (fd, EXT2_IOC_GETFLAGS, &f);\nRun Code Online (Sandbox Code Playgroud)\nioctl对文件描述符进行操作,这意味着必须先打开目标,然后才能设置其标志。符号链接可以\xe2\x80\x99t 打开以与ioctl;一起使用 虽然在符号链接上open支持O_NOFOLLOW和O_NOPATH,但前者本身将失败,并显示ELOOP,而后者将返回一个文件描述符,该文件描述符可以与 一起使用\xe2\x80\x99t ioctl。