私が所有していないファイル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)
_
2番目に(_touch -m file
_)。最初の呼び出しは、「アクセス時間と変更時間を現在の時間に設定する」の省略形です。 2つ目は、「アクセス時間をそのままにして、変更時間を現在の時間に変更する」というものです。
ファイルのユーザーIDと等しい有効なユーザーIDを持つプロセス、ファイルへの書き込みアクセス権を持つプロセス、または適切な特権を持つプロセスのみが、futimens()またはtimensatを使用できます。 ()times引数としてnullポインターを使用するか、両方のtv_nsecフィールドを特別な値UTIME_NOWに設定します。ファイルのユーザーIDと等しい有効なユーザーIDを持つプロセス、または適切な特権を持つプロセスのみが、futimens()またはtimensat()をnull以外で使用できます- times両方が設定されていない引数tv_nsecフィールドがUTIME_NOWに設定されており、両方が設定されていないtv_nsecフィールドがUTIME_OMITに設定されている。
(times
はutimensat()
の3番目の引数です)。 _touch file
_は、アクセス制限の最初のセットに該当します。ファイルへの書き込みアクセスでは、アクセス時間と変更時間を「今」に変更できます。 _touch -m file
_は、アクセス制限の2番目のセットに該当します。アクセス時間と変更時間を両方とも「現在」ではない値に変更するには、root
またはファイルの所有者である必要があります。または両方が「変更されていない」。
所有していないが読み取りまたは書き込みが可能なファイルで、アクセス時間や変更時間を「今」に変更する方法は他にもあります。