为什么touch写保护文件成为可能?
以下不应该出错?
$ touch test.txt
$ chmod a-w test.txt
$ ls -l test.txt
-r--r--r-- 1 name group 0 Jun 13 09:14 test.txt
$ touch test.txt && echo OK
OK
$ ls -l test.txt
-r--r--r-- 1 name group 0 Jun 13 09:15 test.txt
Run Code Online (Sandbox Code Playgroud)
是否touch更改权限,触摸文件,更改权限回来?为什么会这样做?
鉴于此行为,如果我真的想要保护文件以便我(我的用户)永远(无意)更改,删除或更改其时间戳 - 我该怎么办?
(对不起,不是严格的编程相关,但有些,可能是许多程序员感兴趣的.)
来自touch(coreutils)文档:
如果将访问和修改时间都更改为当前时间,则"touch"可以更改运行它的用户不拥有但具有写入权限的文件的时间戳.否则,用户必须拥有这些文件.
该文件包含的目录的执行权限指示能够删除或修改与该文件关联的目录中的条目的inode信息.
由于下面的评论表明我已经掩盖了技术原因,而是提出了一个推理,为什么行为可能不如预期.既然你可以在目录中执行,你可以做很多事情来修改文件,我将把它留在那里.
如果你想阻止除root之外的任何人修改文件,最好的方法是在文件上使用chattr + i文件名.如果没有在其上运行chattr -i,即使root也无法对其执行任何操作.这适用于Linux所以YMMV.
以下是相关输出:strace"touch test.txt"
open("test.txt", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_LARGEFILE, 0666) = -1 EACCES (Permission denied)
futimesat(AT_FDCWD, "test.txt", NULL) = 0
Run Code Online (Sandbox Code Playgroud)
它确实在关于EACCES 的open(2)系统调用中获得了"Permission denied error" .请参阅utimes(2)手册页中的相关部分.
但是,它确实成功地使用futimesat(2)系统调用更新时间戳.
正如其他人所指出的那样,目录权限看起来像是拥有更新访问/ moficiation时间戳的权限.
但是,您可以使用以下命令将文件的属性更改为immutable:
chattr +i test.txt
Run Code Online (Sandbox Code Playgroud)
注意:只有root才能执行此操作,这是禁用文件访问权限的一种非常苛刻的方法.但在极端情况下,它可能很有用.另外,这是一个ext2/3/4功能,据我所知,在其他文件系统上不可用.
如果您拥有文件,则可以更新修改时间,而不管写入权限如何。(与目录上的任何权限无关。)
从POSIX.1-2008:
只有有效用户ID等于文件用户ID或具有对文件的写访问权或具有适当特权的进程,才可以使用
futimens()或utimensat()将null指针用作times参数,或者将两个tv_nsec字段都设置为special值UTIME_NOW。只能使用有效用户ID等于文件用户ID或具有适当特权的进程,futimens()或者utimensat()将两个tv_nsec字段都未设置为UTIME_NOW且两个tv_nsec字段都未设置为的非空时间参数UTIME_OMIT。如果两个tv_nsec字段都设置为UTIME_OMIT,则不会对该文件执行任何所有权或权限检查,但是仍可能检测到其他错误情况(包括与路径前缀有关的[EACCES]错误)。
| 归档时间: |
|
| 查看次数: |
2545 次 |
| 最近记录: |