为什么我可以“触摸”受写保护的文件?

时间:2009-06-13 13:15:43

标签: linux permissions touch

为什么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

touch是否会更改权限,触摸文件以及更改权限?为什么会这样做?

鉴于此行为,如果我真的想要保护文件以便我(我的用户)永远(无意)更改,删除或更改其未来的时间戳 - 我该怎么办?

(对不起,不是严格的编程相关,但有些,可能是许多程序员感兴趣的。)

5 个答案:

答案 0 :(得分:6)

来自touch(coreutils)文档:

  

如果同时更改访问权限和   修改当前的时间   时间,“触摸”可以改变   用户的文件的时间戳   运行它并不拥有,但已写入   许可。否则,用户   必须拥有这些文件。

答案 1 :(得分:6)

该文件包含的目录的执行权限指示能够删除或修改与该文件关联的目录中的条目的inode信息。

正如下面的评论表明我已经掩盖了技术原因,但却提出了一个推理,为什么行为可能不如预期。由于你可以在目录中执行,你可以做很多事情来修改文件,我将把它留在那里。

如果你想阻止除root之外的任何人修改文件,最好的方法是在文件上使用chattr + i文件名。如果没有在其上运行chattr -i,即使root也无法对其执行任何操作。这适用于Linux所以YMMV。

答案 2 :(得分:5)

以下是相关输出: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

关于EACCES的open(2)系统调用确实收到“权限被拒绝错误”。请参阅utimes(2)手册页中的相关部分。

但是,它确实成功地使用futimesat(2)系统调用更新了时间戳。

正如其他人所指出的那样,目录权限看起来像是拥有更新访问/ moficiation时间戳的权利。

但是,您可以使用以下命令将文件的属性更改为不可变:

chattr +i test.txt

注意:只有root才能执行此操作,这是禁用文件访问权限的一种非常苛刻的方法。但在极端情况下,它可能很有用。此外,这是一个ext2 / 3/4功能,据我所知,在其他文件系统上不可用。

答案 3 :(得分:5)

如果您拥有该文件,则无论写入权限如何,都可以更新修改时间。 (它与目录上的任何权限无关。)

从POSIX.1-2008开始:

  

只有有效用户ID等于文件的用户ID,或具有对文件的写访问权或具有适当权限的进程可以使用futimens()utimensat()作为空指针times参数或两个tv_nsec字段都设置为特殊值UTIME_NOW。只有有效用户ID等于文件用户ID或具有适当权限的进程可以使用futimens()utimensat(),其中非空时间参数不包含tv_nsec字段设置为UTIME_NOW,并且两个tv_nsec字段都未设置为UTIME_OMIT。如果两个tv_nsec字段都设置为UTIME_OMIT,则不会对文件执行所有权或权限检查,但仍可能检测到其他错误情况(包括与路径前缀相关的[EACCES]错误)。

答案 4 :(得分:0)

在外行人的术语中,使用touch命令将更新或创建文件而不编辑/修改其内容。因为命令不能(并且不能)从文件中写入或擦除任何内容,所以它可以用在写保护文件上。有关详细信息,请参阅touch命令中的wiki:http://en.wikipedia.org/wiki/Touch_(Unix)