7

touch書き込み保護されたファイルが可能になるのはなぜですか?

以下はエラーを出すべきではありませんか?

$ touch test.txt
$ chmod a-w test.txt
$ ls -l test.txt
-r--r--r-- 1 name group 0 Jun 13 09:14 test.txt
$ touch test.txt && echo OK
OK
$ ls -l test.txt
-r--r--r-- 1 name group 0 Jun 13 09:15 test.txt

touchアクセス許可を変更し、ファイルにアクセスして、アクセス許可を元に戻しますか? なぜそれをするのでしょうか?

この動作を考えると、私 (ユーザー) が将来そのタイムスタンプを (意図せずに) 変更、削除、または変更しないようにファイルを保護したい場合はどうすればよいですか?

(申し訳ありませんが、厳密にはプログラミング関連ではありませんが、わずかですが、おそらく多くのプログラマーにとって興味深いものです。)

4

5 に答える 5

6

touch(coreutils)ドキュメントから:

アクセス時間と変更時間の両方を現在の時間に変更すると、`touch' は、それを実行しているユーザーが所有していないが書き込み許可を持っているファイルのタイムスタンプを変更できます。それ以外の場合、ユーザーはファイルを所有する必要があります。

于 2009-06-13T13:18:30.430 に答える
6

ファイルに含まれるディレクトリの実行権限によって、ファイルに関連付けられたディレクトリ内のエントリの inode 情報を削除または変更できるかどうかが決まります。

以下のコメントが示すように、私は技術的な理由については大雑把に説明しましたが、代わりに動作が期待どおりにならない理由を説明しました。ディレクトリで実行できるので、ファイルをいじるためにできることはたくさんありますが、それはそのままにしておきます。

root 以外がファイルを変更できないようにしたい場合、最良の方法は、ファイルに chattr +i ファイル名を使用することです。root でさえ、chattr -i を実行しないとアクションを実行できません。これは Linux に適用されるため、YMMV です。

于 2009-06-13T13:19:15.517 に答える
5

ファイルを所有している場合は、書き込み権限に関係なく、変更時刻を更新できます。(ディレクトリの権限とは関係ありません。)

POSIX.1-2008から:

実効ユーザーIDがファイルのユーザーIDと等しいか、ファイルへの書き込みアクセス権があるか、適切な特権を持つプロセスのみが、times引数としてnullポインターを使用するfutimens()か、両方のフィールドを特別な値に設定して使用できます。有効なユーザーIDがファイルのユーザーIDと等しいか、適切な特権を持つプロセスのみが、両方のフィールドが設定されておらず、両方のフィールドが設定されていないnull以外のtimes引数を使用できます。両方のフィールドがに設定されている場合、ファイルの所有権またはアクセス許可のチェックは実行されませんが、他のエラー状態が検出される場合があります(パスプレフィックスに関連する[EACCES]エラーを含む)。utimensat()tv_nsecUTIME_NOWfutimens()utimensat()tv_nsecUTIME_NOWtv_nsecUTIME_OMITtv_nsecUTIME_OMIT

于 2009-06-13T15:42:38.057 に答える
5

strace "touch test.txt" からの関連する出力は次のとおりです。

open("test.txt", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_LARGEFILE, 0666) = -1 EACCES (Permission denied)
futimesat(AT_FDCWD, "test.txt", NULL)   = 0

実際、EACCES に関するopen(2)システム コールで「アクセス許可拒否エラー」が発生します。utimes(2) man ページの関連セクションを参照してください。

ただし、futimesat(2)システム コールを使用してタイムスタンプを更新することはできます。

他の人が示しているように、ディレクトリのアクセス許可は、アクセス/変更のタイムスタンプを更新する権利を保持しているようです。

ただし、次を使用してファイルの属性を不変に変更できます。

chattr +i test.txt

注: これを実行できるのは root だけです。これは、ファイルへのアクセスを無効にする非常に厳しい方法です。しかし、極端な場合には、それが役立つことがあります。さらに、これは ext2/3/4 の機能であり、私の知る限り他のファイルシステムでは利用できません。

于 2009-06-13T13:47:07.413 に答える