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


91

ファイルを作成し、そのアクセス許可を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を使用しています。


明確化:これらのコマンドは、rootとしてではなく、通常のユーザーとして実行しています。
マグナス

回答:


104

すべてのrmニーズは、親ディレクトリに対する書き込みと実行の許可です。ファイル自体の許可は関係ありません。

ここだ参照より明確に私が今までできたよりもアクセス許可モデルについて説明します。

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

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

ディレクトリにcdできるようにする(つまり、一部のディレクトリを現在の作業ディレクトリにする)には、ディレクトリに対する実行権限が必要です。

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


2
したがって、最初にchmodを実行せずに一部のファイルを削除/変更できず、他のファイルは自由に書き込み可能なディレクトリを作成したい場合、それは不可能でしょうか?ディレクトリ555をchmodする必要があります。つまり、ディレクトリ内のファイルは作成または変更できません。
マグナス

3
@Magnus-もちろん、読み取り専用ディレクトリ内に書き込み可能な子ディレクトリを作成し、その中に書き込み可能なファイルを保存することを止めるものは何もありません。子ディレクトリ自体は削除できませんが、その内容は削除できます。
ire_and_curses

7
+tディレクトリへの書き込みアクセス権を持っている場合でも、ユーザーが所有していないディレクトリ内のファイルを変更または削除できないように、ディレクトリをスティッキーにすることはできませんか?
シャドゥール

3
@Magnus rootアクセス(sudoを含む)がある場合chattr、ファイルに不変フラグを追加するために使用できます。そうでない場合、ire_and_cursesはまったく正しいです。
ジェームズオゴーマン

6
私は冷静だとしてのみ限り作品-f RMを使用して...プラス、私は持っていませ遅れのbashスクリプトは、私がかないかもしれ書かれたものは全くわからない
マグナス

53

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のパーミッションが許すなら)そして(rootとして)chattr -i不変のビットを削除することです。

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


3
時折便利です。ところで、rootでさえ、不変ファイルを変更または削除することはできません(最初に不変属性を削除しない限り)。また、lsattr属性をリストするために使用します。
cas

2
+ rm
1-

2
これはファイルシステム固有であり、これにより解決できる問題が増える可能性があります。
ステファンギメネス

4
@Magnus:起こりうる問題には、バックアップ(すべてのバックアップユーティリティが属性をバックアップするわけではありません-実際、ほとんどの場合はそうではありません)および復元(既に不変のファイルが含まれるディレクトリに復元する場合、一部のプログラムはそのファイルを上書きできないことを扱います)致命的なエラーおよび中止として)。また、あなたはあなたが不変のファイルを作って、あなたはそれを削除できない理由を把握傾けることを忘れてしまった場合....「操作許可されていません」というエラーメッセージがあなたと見同じエラーメッセージである自分自身の混乱を引き起こす可能性がありますいくつかのファイルシステムの種類破損。潜在的に危険な過剰反応につながる可能性があります。
cas

1
あなたはできる(CP)不変のファイルをコピーします。
タコ

0

この質問への答えの1つは、writeアクセス権がある場合にのみディレクトリからファイルを削除できると主張しています。やってみなよ!ディレクトリにwrite許可を与えて削除しようとすると、できません!
ディレクトリ内のファイルを削除するには、ディレクトリの両方writeexecuteパーミッションが必要です

さて、質問に戻りましょう。使用してファイルを削除するには、rmそのiノード情報をディレクトリから削除するだけですshredding。つまり、ディスクからではありません。ファイルのiノード情報がアクセスできないディレクトリにある場合(親ディレクトリにリストされていないため表示できないため)、つまり削除されます。
したがって、ディレクトリからファイルを削除するには、ディレクトリに対するすべての権限が必要です。そのファイルのパーミッションは無関係です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.