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