Files

為什麼只能觸摸更改,或者當不是所有者時什麼都沒有

  • January 19, 2017

我們有一個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

這是預期的行為嗎?

這種行為是預期的,如果不是很明顯的話。至少在我的系統上,touch確實

utimensat(0, NULL, NULL, 0)

在第一種情況下 ( touch file),並且

utimensat(0, NULL, [UTIME_OMIT, UTIME_NOW], 0)

在第二個(touch -m file)。第一個呼叫是“將訪問和修改時間設置為目前時間”的簡寫;第二個說“不理會訪問時間並將修改時間更改為目前時間”。

POSIX

只有有效使用者 ID 等於文件的使用者 ID、或對文件具有寫訪問權限或具有適當權限的程序才能使用futimens () 或utimensat () 將空指針作為時間參數或同時使用tv_nsec欄位設置為特殊值 UTIME_NOW。只有有效使用者 ID 等於文件的使用者 ID 或具有適當權限的程序才能使用具有非空時間參數的**futimens () 或utimensat (),該參數沒有將兩個tv_nsec欄位都設置為 UTIME_NOW 並且沒有兩個tv_nsec欄位都設置為 UTIME_OMIT。

(times是 ) 的第三個參數utimensat()touch file屬於第一組訪問限制:對文件的任何寫訪問都允許將訪問和修改時間更改為“現在”。touch -m file屬於第二組訪問限制:您需要是root文件的所有者或文件的所有者才能將訪問和修改時間更改為既不是“現在”也不是“未更改”的值。

還有其他方法可以在您不擁有但可以讀取或寫入的文件上將訪問和/或修改時間更改為“現在”:

  • 讀取文件只會更新訪問時間;
  • 寫一個文件(讀它)只會更新修改時間。

引用自:https://unix.stackexchange.com/questions/338604