7

为什么可以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更改权限,触摸文件并更改权限?为什么会这样做?

鉴于这种行为,如果我真的想保护一个文件,以便我(我的用户)将来永远不会(无意地)更改、删除或更改其时间戳——我该怎么做?

(抱歉,不是严格与编程相关的,但对许多程序员来说可能有点兴趣。)

4

5 回答 5

6

touch(coreutils)文档中:

如果将访问和修改时间都更改为当前时间,“touch”可以更改运行它的用户不拥有但具有写入权限的文件的时间戳。否则,用户必须拥有这些文件。

于 2009-06-13T13:18:30.430 回答
6

文件包含的目录的执行权限决定了删除或修改与文件关联的目录中条目的 inode 信息的能力。

正如下面的评论所表明的那样,我已经掩盖了技术原因,而是提供了为什么行为可能不符合预期的原因。由于您可以在目录中执行,因此您可以做很多事情来修改文件,我将把它留在那里。

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

于 2009-06-13T13:19:15.517 回答
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 功能,据我所知,在其他文件系统上不可用。

于 2009-06-13T13:47:07.413 回答
5

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

从 POSIX.1-2008 开始:

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

于 2009-06-13T15:42:38.057 回答
0

通俗地说,使用 touch 命令将更新或创建文件,而无需编辑/修改其内容。因为该命令不会(也不能)从文件中写入或擦除任何内容,所以它可以用于写保护文件。有关更多信息,请参阅有关 touch 命令的 wiki:http://en.wikipedia.org/wiki/Touch_(Unix)

于 2014-09-26T21:56:05.043 回答