foobar
我们有一个不属于我的文件,但它在我的组中:
$ ll
total 4,0K
-rw-rw-r-- 1 root hbogert 4 jan 19 12:27 foobar
我可以触摸它,它会随时更新:
$ stat foobar
File: 'foobar'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 4869333 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 0/ root) Gid: ( 1000/ hbogert)
Access: 2017-01-19 12:27:04.499412133 +0100
Modify: 2017-01-19 12:27:04.499412133 +0100
Change: 2017-01-19 12:27:04.499412133 +0100
Birth: -
$ touch foobar
$ stat foobar
File: 'foobar'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 4869333 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 0/ root) Gid: ( 1000/ hbogert)
Access: 2017-01-19 12:32:04.375412133 +0100
Modify: 2017-01-19 12:32:04.375412133 +0100
Change: 2017-01-19 12:32:04.375412133 +0100
Birth: -
但是,当我只想更改修改时间时,它失败了:
$ touch -m foobar
touch: setting times of 'foobar': Operation not permitted
这是预期的行为吗?
答案1
这种行为是预期的,尽管并不明显。至少在我的系统上touch
是这样
utimensat(0, NULL, NULL, 0)
在第一种情况下(touch file
),并且
utimensat(0, NULL, [UTIME_OMIT, UTIME_NOW], 0)
在第二 (touch -m file
)。第一个调用是“将访问和修改时间设置为当前时间”的简写;第二个说“保留访问时间并将修改时间更改为当前时间”。
只有有效用户 ID 等于文件的用户 ID、或具有对文件的写访问权限或具有适当权限的进程才可以使用福提门() 或者实用卫星() 以空指针作为次论证或两者兼而有之电视_纳秒字段设置为特殊值 UTIME_NOW。只有有效用户 ID 等于文件的用户 ID 或具有适当权限的进程才可以使用福提门() 或者实用卫星() 与非空次不具备两者的论证电视_纳秒字段设置为 UTIME_NOW 并且不具有两者电视_纳秒字段设置为 UTIME_OMIT。
(times
是 ) 的第三个参数utimensat()
。touch file
属于第一组访问限制:对文件的任何写访问都允许将访问和修改时间更改为“现在”。touch -m file
属于第二组访问限制:您需要是root
文件的所有者才能将访问和修改时间更改为既不是“现在”也不是“未更改”的值。
还有其他方法可以将您不拥有但可以读取或写入的文件的访问和/或修改时间更改为“现在”:
- 读取文件只会更新访问时间;
- 写一个文件(没有阅读它)只会更新修改时间。