터치는 왜 항상 바뀌기만 하고, 주인이 없는데 아무것도 바뀌지 않는 걸까요?

터치는 왜 항상 바뀌기만 하고, 주인이 없는데 아무것도 바뀌지 않는 걸까요?

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)에. 첫 번째 호출은 "액세스 및 수정 시간을 현재 시간으로 설정"을 간략하게 표현한 것이며, 두 번째 호출은 "액세스 시간을 유지하고 수정 시간을 현재 시간으로 변경"을 의미합니다.

POSIX설명하다

파일의 사용자 ID와 동일한 유효 사용자 ID, 파일에 대한 쓰기 액세스 권한 또는 적절한 권한이 있는 프로세스만 사용할 수 있습니다.fortimen() 또는실용적인 위성()는 널 포인터를 다음과 같이 취합니다.이류인수 또는 둘 다TV_나노초필드는 특수 값 UTIME_NOW로 설정됩니다. 파일의 사용자 ID와 동일한 유효 사용자 ID 또는 적절한 권한이 있는 프로세스만 이를 사용할 수 있습니다.fortimen() 또는실용적인 위성() 및 비어 있지 않음이류둘 다 논쟁의 여지가 없습니다TV_나노초필드가 UTIME_NOW로 설정되어 있으며 둘 다 없습니다.TV_나노초필드는 UTIME_OMIT로 설정됩니다.

( times는) 세 번째 매개변수 입니다 utimensat(). touch file첫 번째 액세스 제한 세트에 속합니다. 파일에 대한 모든 쓰기 액세스는 액세스 및 수정 시간을 "지금"으로 변경하도록 허용됩니다. 두 번째 액세스 제한 세트에 속합니다. 액세스 및 수정 시간을 "현재" 또는 "변경되지 않음"이 아닌 값으로 변경하려면 파일의 소유자 touch -m file여야 합니다 .root

소유하지는 않지만 읽거나 쓸 수 있는 파일에 대한 액세스 및/또는 수정 시간을 "현재"로 변경하는 다른 방법이 있습니다.

  • 파일을 읽으면 액세스 시간만 업데이트됩니다.
  • 파일 쓰기(아니요읽어보세요) 수정 시간만 업데이트됩니다.

관련 정보