web-dev-qa-db-ja.com

読み取り専用ファイルを変更できるのはなぜですか?

短い質問:

を使用してVimで読み取り専用ファイルを操作できるのはなぜですか : + w + q + ! 管理者でなくても?

長い質問:

すべてのユーザーに対して読み取り専用のテキストファイル(myFile.txt)があります。

navid@navid-ThinkPad-T530:~/ubuntuTest$ ls -l myFile.txt 
-r--r--r-- 1 navid navid 26 Aug 22 21:21 myFile.txt

管理者権限がなくてもVimで開くことができます。

navid@navid-ThinkPad-T530:~/ubuntuTest$ vi myFile.txt 

変更して、次を押します。 Esc + : + w + q + Enter そして、私はこのエラーメッセージが表示されます:

E45: 'readonly' option is set (add ! to override)

これまでのところ、すべてが理にかなっています。しかし、私が押すと: Esc + : + w + q + ! + Enter、Vimは変更を保存します。

Ubuntu 16.04とVIM 7.4を使用しています。

42
Navid Vafaei

@Robはすでに 言及 であるため、ファイルを含むディレクトリへの書き込みアクセス権がある場合にのみこれを行うことができます。たとえば、/etcのファイルに同じことをしようとすると失敗します。

howvimがこれを行う場合、ファイルを削除して再作成します。これをテストするために、rootが所有するファイルを作成しました。

echo foo | Sudo tee fff

次に、説明した方法でvimを使用してファイルを編集しましたが、プロセスをstraceにアタッチして、何が起こっているかを確認しました。

strace vim fff 2> strace.out

それからstrace.outを確認し、見つけました:

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

したがって、ファイルは最初に削除され(unlink("fff"))、次に同じ名前の新しいファイルが作成され(open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644))、行った変更が書き込まれました(write(4, "foasdasdao\n", 11))。これを自宅で試してみると、vimで編集した後、ファイルはルートではなくあなたのものになります。

したがって、厳密に言うと、vimは、書き込みアクセス権のないファイルを編集していません。書き込みアクセス権があるディレクトリからファイルを削除してから、再び書き込みアクセス権を持つ新しいファイルを作成しています。

58
terdon

w!を使用すると、元のファイルが削除され(実行が許可されます)、代わりにバージョンが書き込まれます。

ディレクトリへの書き込みアクセス権がある場合、そのディレクトリ内でファイルを作成、移動、または削除できます。

$ mkdir foo
$ echo hi > foo/file
$ chmod 777 foo
$ chmod 700 foo/file
$ ls -l foo/file 
-rwx------ 1 ravexina ravexina 7 Aug 31 03:19 foo/file

ユーザーを切り替えてファイルを変更します

$ Sudo -u user2 -s
$ vi foo/a # save using w! (I wrote into the file bye)
$ ls -l foo/a
-rwx------ 1 user2 user2 7 Aug 31 03:20 foo/file

そこに何があるか見てみましょう:

$ cat foo/file
bye
16
Ravexina

親ディレクトリを所有している限り、ディレクトリの内容を変更できるため、許可に関係なくファイルを削除または置換できます:)。

Rmのような他のコマンドで試してください。プロンプトが表示されますが、まだ実行できます。ディレクトリを書き込み不可にすると、停止します。

添加:

試してみましたが、ファイルを所有している限り、フォルダが読み取り専用であっても変更できます。ただし、所有権をroot:rootに変更すると、ファイルを書き込み用に開くことができません。そのため、root(または他の誰か)が所有する変更ファイルを解決します

16
Rob

:help write-readonly を参照してください:

                                                        write-readonly
When the 'cpoptions' option contains 'W', Vim will refuse to overwrite a
readonly file.  When 'W' is not present, ":w!" will overwrite a readonly file,
if the system allows it (the directory must be writable).

ディレクトリに対する書き込み権限があるため(ディレクトリ内のファイルを作成、削除、または名前変更できることを意味します)、システムはそれを許可します。


cpoptions のデフォルト値にはWが含まれていません。

                                                'cpoptions' 'cpo' cpo
'cpoptions' 'cpo'       string  (Vim default: "aABceFs",
                                 Vi default:  all flags)
                        global
10
muru

Vimエディタープロセスとファイルの両方に、

 getpwnam("navid")->pw_uid

あなたがシェルアウトすることもできるように所有権

 :!chmod +w %

かつてはもっとシンプルだったと思うかもしれません

 :!rm %

(.wの+ w、u-tのリンク解除許可のみが必要で、所有権さえも必要ではありません)誰かが入力するのが頻繁になりすぎたため、vimは自動的に提供され、要求に応じてそのような操作を自動的に実行するように再プログラムされました。

姉のを上書きしてみてください

 /home/whoopi/.profile

あなたのvimはあなたの拒否を与えるだけであるので.

2
Roman Czyborra

これはVIMからの警告であり、UNIXで権限がどのように機能するかを考えると比較的重要かもしれません。これの明らかな直感的ではない理由は、UNIXファイルシステムがファイルのiノードに保存されたファイルに対する許可を持っているためです。ディレクトリ構造は何らかの形で分離されており、これらのiノードのみをリンクしています。ディレクトリには、ファイルのリンク/リンク解除、読み取り、またはサブディレクトリへの移動を許可する権限もあります。この設計により、同じファイルをディレクトリ構造の複数の異なる場所に(ハードリンクを介して)表示できます。 「オーバーライド!オーバーライド」と言うことで、VIMは、元のファイルがリンク解除され(他のすべての場所にそのまま残る)、新しいファイルが作成され、元のファイルにリンクされることを警告しようとしていますディレクトリ構造に配置します。元のファイルのリンクカウントがゼロに減少した場合、元のファイルは解放されますが、そうでない場合は、ファイルを効果的に複製しています。ファイルを開くこともリンクとしてカウントされるため、あるプログラムがファイルを開いて「add to to override」に同意した場合、VIMを使用してファイルに加えられた変更はプログラムに表示されません。ファイルはVIMによってのみディレクトリからリンク解除され、別のプログラムでファイルを閉じた後、他の場所にリンクされていない限り、ファイルは解放されます。

Windowsでは、ファイルのアクセス許可はディレクトリに保存されるため、Windowsアクセス許可パラダイムの観点からは、このvimの動作は実際には奇妙に見える場合があります。ファイルへの書き込みについて、Windowsは論理的に、一部のディレクトリアクセス許可、スーパーディレクトリアクセス許可もチェックする場合があります。上記のように、UNIXでは、ファイルを一覧表示して開くことができる限り、ディレクトリのアクセス許可はファイルの操作には関係ありません(つまり、すべてのスーパーディレクトリにxがありました)。 UNIXで開かれたファイルは、開いた後にすべてのディレクトリからリンク解除された場合、ファイル名さえもなくなる可能性があります。

たとえば、ファイル/ home/user1/fooがあり、それが/ home/user2/fooと同じ(つまりハードリンクされている)ファイルであり、そのファイルは誰でも書き込み可能ではなく、現在プログラムPで開かれているルートによって起動されたプログラム)。 user1がvimでそれを開いて上書きした場合、ユーザー1は独自のコピーを作成し、元のファイルは表示されなくなります。その後、user2がvimでリンクを開いて書き込みを行うと、再びリンクが解除され、別のコピーが作成されます。プログラムPは元のファイルを引き続き表示し、自由に読み書きできます。プログラムがファイルを閉じるとすぐに、ファイルは消えます(ファイルシステムによって解放されます)。

2
ludvik02

これは正確な答えではありませんが、ファイルを変更したり削除したりできないように設定したい場合は、不変にすることができます。

通常、ファイルがルートによって所有されている場合でも、フォルダへの書き込み権限がある場合はファイルを削除できます。ただし、ファイルを不変にすると、rootでさえ変更または削除できなくなります。

ファイルを不変にするには(Sudoが必要です):

Sudo chattr +i myFile.txt

これはlsattr(結果の文字i)で見ることができます:

$ lsattr myFile.txt
----i--------e-- myFile.txt

ファイルを再び正常にするには:

Sudo chattr -i myFile.txt

明確にするために:ファイルが不変である場合、削除、名前変更、変更、またはハードリンクさえできません。

ファイルには多くの有用な属性があるため、man chattrを読む価値があります。

「制限付き削除」も役立つ場合があります。 (ファイルではなく)フォルダーに配置されている場合、これは、フォルダー内でファイルを作成する人は誰でもそのファイルを変更または削除することを許可されますが、他のユーザーは許可されないことを意味します(ルートを除く)。フォルダ/tmpにはこのフラグが設定されています。これは、/tmptフラグで確認できます。

$ ls -l --directory /tmp
drwxrwxrwt 10 root root 4096 Sep  6 09:00 /tmp

フォルダーの削除制限フラグを設定または削除するには:

chmod +t myFolder      # Add the restricted deletion flag.
chmod -t myFolder      # Remove the restricted deletion flag.
1
Paddy Landau