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

为什么可以touch写保护的文件?

下面不应该给出错误?

 $ touch test.txt $ chmod aw 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更改权限,触摸文件,并更改权限? 为什么会这样做?

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

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

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

正如下面的评论表明我已经掩盖了技术原因,而是提供了一个推理,为什么行为可能不如预期。 既然你可以在目录中执行,那么你可以做一些修改文件的事情,而我将会保留这个文件。

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

touch (coreutils)文档:

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

以下是相关的输出: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功能,据我所知,在其他文件系统上不可用。

无论写入权限如何,您都可以更新修改时间。 (这与目录上的任何权限无关。)

从POSIX.1-2008:

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

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