非 sudo ユーザーに、権限が拒否される代わりに「rm: 書き込み保護された通常の空のファイルを削除します」というメッセージが表示される

非 sudo ユーザーに、権限が拒否される代わりに「rm: 書き込み保護された通常の空のファイルを削除します」というメッセージが表示される

Linux サーバーに追加のディスクを追加しました。

fstab に次の行を追加しました:

UUID=e277f402-bbac-4830-bc1d-5a849ffe7f9c /disk1          ext4    defaults 0 0

次にマウントポイント/disk1を作成し、マウントしました

 sudo mkdir /disk1
 sudo mount /disk1

次に、ユーザー「hari」として空のファイルtouch1.txtを作成しました。その権限は次の通りです。

sudo touch test1.txt

-rw-rw-r-- 1 hari hari     0 Sep 12 18:23 test1.txt

今、別のユーザーとしてログインして test1.txt ファイルを削除すると、「アクセスが拒否されました」と表示されるのではなく、実際に確認してから拒否されます。なぜそうなるのでしょうか。また、これを「通常」のように動作させるにはどうすればよいのでしょうか。

hari2@UBUNTU01:/disk1$ rm test2.txt
rm: remove write-protected regular empty file ‘test2.txt’? y
rm: cannot remove ‘test2.txt’: Operation not permitted

答え1

削除操作に関しては、Unix の権限が少し奇妙です。

まず、ファイルを削除するということは、実際にはディレクトリからファイルへのリンクを削除することを意味します。ほとんどの Unix ファイルシステムではハードリンクが許可されているため、ファイルが複数のディレクトリからリンクされ、複数のリンクが存在する可能性があります。また、リンクを削除しても、そのファイルへの他のリンクが存在しない限り、ファイルは削除されません。

このため、ファイルを「削除」するために使用される実際のシステム コールは と呼ばれますunlink。ただし、リンク解除を実行するシェル コマンド ユーティリティは と呼ばれrm、これは「削除」のニーモニックです。

リンク解除操作はディレクトリ(ディレクトリエントリを削除することによって)ファイルではなく、操作に必要な権限は書き込み権限です。ディレクトリ上ファイル自体の権限は関係ありません。

しかし、書き込み権限を持つディレクトリから、実際には自分のものではないファイルを削除しようとするのはよくある間違いです。(より正確には、このような状況は一般的ではありませんが、そのような状況が存在する場合、誤ってファイルを削除しようとするのはよくあることです。)

システム管理者が自らの足を撃つことを防ぐために、rmユーティリティはまずそれを呼び出した人が書き込み権限を持っているかどうかを確認します。ファイルただし、ファイルのリンクを解除するためにその権限は必要ありません。 明らかな理由により、ファイルの削除を試みる前にこのチェックが行われます。

このrmユーティリティはないユーザーがファイルのリンクを解除できるかどうかを確認します。「アクションの前にチェックする」というのは、一般的には悪いスタイルだと考えられています。むしろ、必要なアクションを実行し、オペレーティング システムがエラーを返した場合には失敗を報告します。この場合、ユーザーにはディレクトリへの書き込みアクセス権がないため、OS は EACCES を報告します。

残念なことに、書き込み権限のないディレクトリから書き込み権限のないファイルを削除しようとすると、rm続行するかどうかを無駄に尋ねられ、失敗が報告されます。

関連情報