web-dev-qa-db-ja.com

読み取り専用ファイルをrmで削除できるのはなぜですか?

ファイルを作成し、その権限を444(読み取り専用)に変更した場合、rmでファイルを削除できるのはなぜですか?

私がこれをすると:

echo test > test.txt
chmod 444 test.txt
rm test.txt

...rmは、書き込み保護されたファイルtest.txtを削除するかどうかを尋ねます。私はrmがそのようなファイルを削除できないことと、最初にchmod +w test.txtを実行する必要があると予想していました。 rm -f test.txtを実行すると、rmは、読み取り専用であっても、確認なしでファイルを削除します。

誰でも明確にできますか? Ubuntu 12.04/bashを使用しています。

96
Magnus

rmに必要なのは、親ディレクトリに対する書き込みと実行の権限だけです。ファイル自体の権限は関係ありません。

これが 参照 です。これは、アクセス許可モデルをこれまで以上に明確に説明しています。

ファイルのデータにアクセスするには、読み取り権限が必要です。ファイルのデータを変更するには、書き込み権限が必要です。ファイル(プログラムまたはスクリプト)を実行するには、実行権限が必要です...

ディレクトリは通常のファイルと同じように使用されないため、アクセス許可の動作は少し(ただし少しだけ)異なります。ディレクトリ内のファイルを一覧表示するには、ディレクトリの読み取り権限が必要ですが、その中のファイルに対する権限は必要ありません。ディレクトリへのファイルの追加、ディレクトリからのファイルの削除、またはファイル名の変更を行うには、すべてディレクトリに対する書き込み権限が必要ですが、(驚くべきことに)内部のファイルに対する権限は必要ありません。実行権限はディレクトリには適用されません(ディレクトリをプログラムにすることはできません)。しかし、その許可ビットは他の目的のディレクトリに再利用されます。

そこにcdするには(つまり、いくつかのディレクトリを現在の作業ディレクトリにするため)、実行権限がディレクトリに必要です。

実行は、ディレクトリ内でファイル内の「iノード」情報にアクセスするために必要です。これは、ディレクトリを検索して、その中のファイルのiノードを読み取るために必要です。このため、ディレクトリに対する実行権限は、多くの場合、代わりに検索権限と呼ばれます。

110
ire_and_curses

OK、ire_and_cursesへのコメントによると、本当にやりたいことは、いくつかのファイルを不変にすることです。これはchattrコマンドで実行できます。例えば:

例えば.

$ cd /tmp
$ touch immutable-file
$ Sudo chattr +i immutable-file

$ rm -f immutable-file
rm: remove write-protected regular empty file `immutable-file'? y
rm: cannot remove `immutable-file': Operation not permitted

$ mv immutable-file someothername
mv: cannot move `immutable-file' to `someothername': Operation not permitted

$ echo foo > immutable-file 
-bash: immutable-file: Permission denied

不変ファイルには何もできません。ファイルの削除、編集、上書き、名前の変更、chmodやchown、その他のことはできません。あなたがそれでできる唯一のことはそれを読むことです(UNIXの許可が許可している場合)そして(ルートとして)chattr -iは、不変ビットを削除します。

すべてのファイルシステムがすべての属性をサポートするわけではありません。私の知る限り、不変はすべての一般的なLinuxファイルシステムでサポートされています(ext2/3/4とxfsを含みます。現時点ではzfsonlinuxは属性をサポートしていません)

53
cas

この質問に対する1つの回答は、write権限のみが完全に間違っている場合にのみ、ディレクトリからファイルを削除できると主張しています。やってみなよ!ディレクトリにwrite権限のみを与えて削除しようとすると、できません!
ディレクトリ内のファイルを削除するには、ディレクトリに対するwriteexecuteの両方の権限が必要です

ここで質問に戻ります。rmを使用してファイルを削除するには、ディレクトリからiノード情報を削除するだけです。つまり、ディスクからshreddingではありません。ファイルのiノード情報がディレクトリにない場合はアクセスできません(親ディレクトリにリストされていないため表示できないため)。つまり、deleted あなたのために。
このようにして、ディレクトリからファイルを削除すると、ディレクトリで許可されたすべての権限が与えられます。そのファイルの権限は無関係です

0
Edward Torvalds