君の知らないvimの小さな秘密


まず背景知識を理解してみましょう.
1)ファイルにi権限を付与すると,そのファイルは変更されず,削除されず,名前や権限を変更することもできない.
2)ファイルにa権限を付与し,ファイルに内容を追加でき,削除できず,内容を変更できず,名前や権限を変更できない.
3)vimは1つのファイルで、正常に終了しなければ、再編集時にいくつかの情報を提示し、隠れたファイルがある.xxx.swp
以上の知識を理解してから、次の現象を見てみましょう.
1)1つのファイルにa権限を追加し、vimでファイルを編集し、コンテンツを追加する(ファイルの末尾にコンテンツを追加し、他のコンテンツを変更しないことに注意)と、成功しません.
2)ディレクトリにi権限またはa権限を追加すると、そのディレクトリの下にvimファイルがあり、ファイル内容を変更して正常に保存できます.
a権限でコンテンツを追加できる以上、vimファイルの末尾にコンテンツを追加することはできませんか?i権限が変更できない以上、なぜディレクトリ内でファイルの内容を変更することができますか?
この2点について、あなたは疑問を持っていますか?原因を分析します.
iまたはa権限にかかわらず、iまたはa権限のないディレクトリの下で、iまたはa権限のないファイルを編集し、straceで実行プロセスを表示します.
mkdir /tmp/test
strace vim /tmp/test/aminglinux.txt 2>/tmp/vim.log

数値1を書き込み、保存して終了します.またvimを見てみましょうロゴの内容.
less /tmp/vim.log

ほとんどの内容は気にしないで、これらの行を見るだけです.
stat(“/tmp/test/aminglinux.txt”, 0x7fff072ecb10) = -1 ENOENT (No such file or directory)
access(“/tmp/test/aminglinux.txt”, W_OK) = -1 ENOENT (No such file or directory)
open(“/tmp/test/aminglinux.txt”, O_RDONLY) = -1 ENOENT (No such file or directory)
readlink(“/tmp/test/aminglinux.txt”, 0x7fff072eb360, 4095) = -1 ENOENT (No such file or directory)
open(“/tmp/test/.aminglinux.txt.swp”, O_RDONLY) = -1 ENOENT (No such file or directory)
open(“/tmp/test/.aminglinux.txt.swp”, O_RDWR|O_CREAT|O_EXCL, 0600) = 3
open(“/tmp/test/.aminglinux.txt.swx”, O_RDONLY) = -1 ENOENT (No such file or directory)
open(“/tmp/test/.aminglinux.txt.swx”, O_RDWR|O_CREAT|O_EXCL, 0600) = 4
unlink(“/tmp/test/.aminglinux.txt.swx”) = 0
unlink(“/tmp/test/.aminglinux.txt.swp”) = 0
stat(“/tmp/test/.aminglinux.txt.swp”, 0x7fff072ec310) = -1 ENOENT (No such file or directory)
lstat(“/tmp/test/.aminglinux.txt.swp”, 0x7fff072ec3e0) = -1 ENOENT (No such file or directory)
lstat(“/tmp/test/.aminglinux.txt.swp”, 0x7fff072ec8a0) = -1 ENOENT (No such file or directory)
open(“/tmp/test/.aminglinux.txt.swp”, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0600) = 3
stat(“/tmp/test/aminglinux.txt”, 0x7fff072eac40) = -1 ENOENT (No such file or directory)
stat(“/tmp/test/aminglinux.txt”, 0x7fff072ebe20) = -1 ENOENT (No such file or directory)
stat(“/tmp/test/aminglinux.txt”, 0x7fff072eadf0) = -1 ENOENT (No such file or directory)
write(1, “\”/tmp/test/aminglinux.txt\””, 26) = 26
stat(“/tmp/test/aminglinux.txt”, 0x7fff072ec050) = -1 ENOENT (No such file or directory)
open(“/tmp/test/aminglinux.txt”, O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
stat(“/tmp/test/aminglinux.txt”, {st_mode=S_IFREG|0644, st_size=2, …}) = 0
stat(“/tmp/test/aminglinux.txt”, {st_mode=S_IFREG|0644, st_size=2, …}) = 0
unlink(“/tmp/test/.aminglinux.txt.swp”) = 0

散らかっているように見えますが、大体の過程はvim/tmp/test/aminglinuxです.txtの場合、まずあるかどうかを見ます.aminglinux.txt.swpおよび.aminglinux.txt.swxは、この2つのファイルがvimによって生成された一時ファイルであるため、swpが先に生成され、swpが存在する場合、2番目のswxが生成される.書き込まれたコンテンツはswpに保存する、vimを終了したときにswpのコンテンツをaminglinuxに保存する.txtで、最後にswpファイルを削除します.
この認識があったら、上記の現象を分析します.ファイルがa権限を与えた場合、ファイルを編集するとswpファイルが生成され、保存が終了するとswpファイルの内容がファイルに書き込まれます.これはファイルを変更することに相当し、オンラインa権限は許可されません.
さらに現象2を分析すると,我々の推測によれば,ディレクトリがa権限を与えてファイルを増やしても問題ない,すなわちswpやswxファイルが発生しても問題ない,もちろんswpやswxの内容をファイルに書き込む際にも問題はないが,swpやswxファイルは削除されないため,ファイルを再編集する際に一時ファイルが存在していることが示唆される.ただし、ファイルの内容の変更には影響しません.
ディレクトリにi権限が設定されている場合、vimはファイルを編集し、swpやswxを生成するには間違いないでしょうが、なぜファイルを正常に編集できるのでしょうか.次にstraceで分析を続けます.
chattr +i  /tmp/test
strace vim /tmp/test/aminglinux.txt 2> /tmp/vim.log

見てみろロゴの中とaminglinux.txt関連情報
stat(“/tmp/test/aminglinux.txt”, {st_mode=S_IFREG|0644, st_size=4, …}) = 0
stat(“/tmp/test/aminglinux.txt”, {st_mode=S_IFREG|0644, st_size=4, …}) = 0
stat(“/tmp/test/aminglinux.txt”, {st_mode=S_IFREG|0644, st_size=4, …}) = 0
stat(“/tmp/test/aminglinux.txt”, {st_mode=S_IFREG|0644, st_size=4, …}) = 0
access(“/tmp/test/aminglinux.txt”, W_OK) = 0
open(“/tmp/test/aminglinux.txt”, O_RDONLY) = 3
readlink(“/tmp/test/aminglinux.txt”, 0x7fff49efc6f0, 4095) = -1 EINVAL (Invalid argument)
open(“/tmp/test/.aminglinux.txt.swp”, O_RDONLY) = -1 ENOENT (No such file or directory)
open(“/tmp/test/.aminglinux.txt.swp”, O_RDWR|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied)
stat(“/tmp/test/.aminglinux.txt.swp”, 0x7fff49efd6a0) = -1 ENOENT (No such file or directory)
lstat(“/tmp/test/.aminglinux.txt.swp”, 0x7fff49efd770) = -1 ENOENT (No such file or directory)
lstat(“/tmp/test/.aminglinux.txt.swp”, 0x7fff49efdc30) = -1 ENOENT (No such file or directory)
open(“/tmp/test/.aminglinux.txt.swp”, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0600) = -1 EACCES (Permission denied)
readlink(“/tmp/test/aminglinux.txt”, 0x7fff49efc6f0, 4095) = -1 EINVAL (Invalid argument)
open(“/root/tmp/aminglinux.txt.swp”, O_RDONLY) = -1 ENOTDIR (Not a directory)
open(“/root/tmp/aminglinux.txt.swp”, O_RDWR|O_CREAT|O_EXCL, 0600) = -1 ENOTDIR (Not a directory)
stat(“/root/tmp/aminglinux.txt.swp”, 0x7fff49efd6a0) = -1 ENOTDIR (Not a directory)
lstat(“/root/tmp/aminglinux.txt.swp”, 0x7fff49efd770) = -1 ENOTDIR (Not a directory)
lstat(“/root/tmp/aminglinux.txt.swp”, 0x7fff49efdc30) = -1 ENOTDIR (Not a directory)
open(“/root/tmp/aminglinux.txt.swp”, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0600) = -1 ENOTDIR (Not a directory)
readlink(“/tmp/test/aminglinux.txt”, 0x7fff49efc6f0, 4095) = -1 EINVAL (Invalid argument)
open(“/var/tmp/aminglinux.txt.swp”, O_RDONLY) = -1 ENOENT (No such file or directory)
open(“/var/tmp/aminglinux.txt.swp”, O_RDWR|O_CREAT|O_EXCL, 0600) = 4
open(“/var/tmp/aminglinux.txt.swx”, O_RDONLY) = -1 ENOENT (No such file or directory)
open(“/var/tmp/aminglinux.txt.swx”, O_RDWR|O_CREAT|O_EXCL, 0600) = 5
unlink(“/var/tmp/aminglinux.txt.swx”)   = 0
unlink(“/var/tmp/aminglinux.txt.swp”)   = 0
stat(“/var/tmp/aminglinux.txt.swp”, 0x7fff49efd6a0) = -1 ENOENT (No such file or directory)
lstat(“/var/tmp/aminglinux.txt.swp”, 0x7fff49efd770) = -1 ENOENT (No such file or directory)
lstat(“/var/tmp/aminglinux.txt.swp”, 0x7fff49efdc30) = -1 ENOENT (No such file or directory)
open(“/var/tmp/aminglinux.txt.swp”, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0600) = 4
chmod(“/var/tmp/aminglinux.txt.swp”, 0644) = 0
open(“/tmp/test/aminglinux.txt”, O_RDONLY) = 3
stat(“/tmp/test/aminglinux.txt”, {st_mode=S_IFREG|0644, st_size=4, …}) = 0
stat(“/tmp/test/aminglinux.txt”, {st_mode=S_IFREG|0644, st_size=4, …}) = 0
stat(“/tmp/test/aminglinux.txt”, {st_mode=S_IFREG|0644, st_size=4, …}) = 0
access(“/tmp/test/aminglinux.txt”, W_OK) = 0
write(1, “\”aminglinux.txt\””, 16)      = 16
stat(“aminglinux.txt”, {st_mode=S_IFREG|0644, st_size=4, …}) = 0
access(“aminglinux.txt”, W_OK)          = 0
getxattr(“aminglinux.txt”, “system.posix_acl_access”, 0x7fff49efd050, 132) = -1 ENODATA (No data available)
stat(“aminglinux.txt”, {st_mode=S_IFREG|0644, st_size=4, …}) = 0
open(“aminglinux.txt”, O_WRONLY|O_CREAT|O_TRUNC, 0644) = 3
chmod(“aminglinux.txt”, 0100644)        = 0
setxattr(“aminglinux.txt”, “system.posix_acl_access”, “\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff”, 28, 0) = 0
stat(“/tmp/test/aminglinux.txt”, {st_mode=S_IFREG|0644, st_size=6, …}) = 0
unlink(“/var/tmp/aminglinux.txt.swp”)   = 0

現在のディレクトリにはi権限があり、ファイルを追加することはできません.また、現在のディレクトリの下で一時ファイルを生成することはできません.もちろんvimはこのような問題に遭遇すると、「曲線救国」するので、まず/root/tmp/を探しますが、このディレクトリはなく、/var/tmp/を探し続けるしかありません.このディレクトリは存在しますので、このディレクトリに一時ファイルが生成されます(非表示ではありません).後の操作は言うまでもない.
vimが/var/tmp/で一時ファイルを生成できる以上、i権限が設定されたディレクトリでファイルを編集することもできるのは当然であり、このような現象2も解釈できる.こんなにくどくど言っているのに、実は私は次のような観点を表現したいと思っています.
vimがファイルを編集すると、そのファイルが存在するディレクトリに一時的な非表示ファイルが生成される.swp和.swxは、そのディレクトリが書き込み不可であれば/root/tmp/下または/var/tmp/下に一時ファイル(非表示)を生成し、編集したファイルが保存されると一時ファイルが削除されます.
広告を挿入します:阿銘Linux保障クラスの第3期はもうすぐ開講して、課程の詳細http://www.apelearn.com/linux/lesson_new_intro.html