一般ユーザーは、ルートが所有するファイルを変更できます。

一般ユーザーは、ルートが所有するファイルを変更できます。

ファイルがルートによって生成されたプレーンテキストファイルの場合は、次のコマンドを使用します。

echo 'foo' > ./file.txt

あなたのls -lもの:

-rw-r--r-- root root ./file.txt

ただし、一般ユーザーとしてこの設定を変更できます。ウィムで保存する:w!sedコマンド、これが発生した場合ユーザーとグループファイル所有者は次のように変更されます。

-rw-r--r-- user user ./file.txt

他人の読み取り権限が削除された場合はchmod o-r ./file.txt変更できなくなりましたが、復元するとchmod o+r ./file.txt再度変更できることがわかりました。

ここで何が起こっているのでしょうか? 「その他」の読み取り権限でルートが所有するファイルを変更し、ユーザーとグループの所有権を変更できるのはなぜですか。

なぜこれが起こるのですか?

PS:私はDebian SIDを使用しています。

ベストアンサー1

これは、次の2つの理由で発生します。

  • vim(少なくともこの場合)、sedライブ編集を行うと、実際には元のファイルが削除され、同じ名前の新しいファイルが作成されます。

  • ファイル削除機能は、ファイル自体の権限ではなく、ファイルを含むディレクトリの権限によって異なります。

したがって、ここで何が起こるのかは、ディレクトリへの書き込み権限があるということです。これは、ファイルの削除や作成など、ディレクトリの内容を変更できることを意味します。したがって、実行sed -iまたは保存すると、:w!元のファイルが削除され、新しいファイルが生成されます。これが所有権が変更される理由でもあります。実際には別のファイルです。

ファイルの内容を確認できます。インデックスノード編集前と後:

$ ls -ld foo/
drwxr-xr-x 2 terdon terdon 266240 Nov 16 13:43 foo/
$ cd foo
$ sudo sh -c 'echo foo > file'
$ ls -l 
total 4
-rw-r--r-- 1 root root 4 Nov 16 13:43 file

このコマンドの後、一般ユーザーはfile書き込み権限を持つディレクトリのルート所有権を持ちます。foo/それではls -i、次のようにinodeを確認し、変更してもう一度確認してsedみましょう。

$ ls -li file 
26610890 -rw-r--r-- 1 root root 4 Nov 16 13:43 file
$ sed -i 's/foo/bar/' file
$ ls -li file 
26610859 -rw-r--r-- 1 terdon terdon 4 Nov 16 15:40 file

vim次のコマンドを実行して同じことを確認することもできます。

strace vim file 2> strace.out

その後、ファイルを編集して別の:w!名前で保存すると、次のようにstrace.outなります。

    unlink("file")                           = 0
    open("file", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
    write(4, "bar\n", 11)            = 11

したがって、ファイルが最初に削除され(unlink("file"))、同じ名前の新しいファイルが作成され(open("file", O_WRONLY|O_CREAT|O_TRUNC, 0644))、修正がそのファイルに書き込まれます(write(4, "bar\n", 11))。

上記のように、inodeが変更されました。同じ名前の新しいファイルです。したがって、書き込み権限のないファイルを実際に変更するのではなく、目次そのディレクトリからファイルを削除し、そのディレクトリに古いファイルと同じ名前で新しいファイルを作成すると、書き込みアクセス権があります。

私は同様の質問に答えました。https://askubuntu.com/a/815849/85695

おすすめ記事