web-dev-qa-db-ja.com

変更を常にタッチできるのはなぜですか、所有者でない場合は何もタッチできない

私が所有していないファイル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

これは予想される動作ですか?

7
hbogert

かなり自明ではないにしても、動作は予想されます。少なくとも私のシステムでは、touch

_utimensat(0, NULL, NULL, 0)
_

最初のケースでは(_touch file_)、および

_utimensat(0, NULL, [UTIME_OMIT, UTIME_NOW], 0)
_

2番目に(_touch -m file_)。最初の呼び出しは、「アクセス時間と変更時間を現在の時間に設定する」の省略形です。 2つ目は、「アクセス時間をそのままにして、変更時間を現在の時間に変更する」というものです。

[〜#〜] posix [〜#〜] は言う

ファイルのユーザーIDと等しい有効なユーザーIDを持つプロセス、ファイルへの書き込みアクセス権を持つプロセス、または適切な特権を持つプロセスのみが、futimens()またはtimensatを使用できます。 ()times引数としてnullポインターを使用するか、両方のtv_nsecフィールドを特別な値UTIME_NOWに設定します。ファイルのユーザーIDと等しい有効なユーザーIDを持つプロセス、または適切な特権を持つプロセスのみが、futimens()またはtimensat()をnull以外で使用できます- times両方が設定されていない引数tv_nsecフィールドがUTIME_NOWに設定されており、両方が設定されていないtv_nsecフィールドがUTIME_OMITに設定されている。

timesutimensat()の3番目の引数です)。 _touch file_は、アクセス制限の最初のセットに該当します。ファイルへの書き込みアクセスでは、アクセス時間と変更時間を「今」に変更できます。 _touch -m file_は、アクセス制限の2番目のセットに該当します。アクセス時間と変更時間を両方とも「現在」ではない値に変更するには、rootまたはファイルの所有者である必要があります。または両方が「変更されていない」。

所有していないが読み取りまたは書き込みが可能なファイルで、アクセス時間や変更時間を「今」に変更する方法は他にもあります。

  • ファイルを読み取ると、アクセス時間のみが更新されます。
  • ファイルの書き込み(なし読み取り)は、変更時間のみを更新します。
7
Stephen Kitt