В следующем примере показано, как создать файл только с разрешениями на чтение. Как мы можем видеть, когда я пытаюсь записать в этот файл , используя команду эха я получаю, Permission denied
.
Но почему, если мы используем vi, мы не получаем Permission denied
? Как можно видеть здесь, мы можем записать в файл, даже если файл доступен только для чтения.
Что здесь происходит? Это ошибка ви?
[admin@madona-machine1 ~]$ touch test-file
[admin@madona-machine1 ~]$ ls -ltr
total 0
-rw-r--r-- 1 admin admin 0 Apr 13 07:32 test-file
[admin@madona-machine1 ~]$ chmod -w test-file
[admin@madona-machine1 ~]$ ls -ltr
total 0
-r--r--r-- 1 admin admin 0 Apr 13 07:32 test-file
[admin@madona-machine1 ~]$ echo try_to_write > test-file
-bash: test-file: Permission denied
[admin@madona-machine1 ~]$ vi test-file
I am good singer,
~
~
~
~
~
~
~
"test-file" 1L, 4C written
Ответы:
Примечание . Из-за устаревших причин лицензирования большинство дистрибутивов GNU / Linux не содержат оригинальную программу vi, написанную Биллом Джой. Вместо этого команда vi предоставляется при запуске Vim в режиме совместимости с vi. Следующий ответ основан на запуске Vim с его режимом совместимости с vi.
Изменение файла только для чтения
Вим предупреждает пользователя , если они изменяют буфер файла только для чтения,
W10: Warning: Changing a readonly file
. Если пользователь пытается записать в этот файл, он получает следующее сообщение об ошибке'readonly' option is set (add ! to override)
.Когда родительский каталог доступен для записи пользователем Vim
Vim, будучи полезным, позволяет пользователю знать, что он может настаивать на написании, добавляя восклицательный знак
!
вw
команду. Если используется эта принудительная версия команды записи, Vim удаляет исходный файл (если при использовании Vim с установленнойbackup
опцией Vim-only исходный файл фактически переименовывается, чтобы совпадать с файлом резервной копии). Затем он открывает (создает) новый файл с тем же именем, что и оригинал, и записывает содержимое своего буфера в этот новый файл. Это можно увидеть, проверив inode файла до и после запуска Vim:Примечание. Это также может изменить разрешение и владельца файла и разорвать (символические) ссылки, например, если исходный файл принадлежит другому пользователю, новый файл будет принадлежать пользователю, работающему под управлением Vim.
Процесс может сделать это, только если у него есть разрешение на запись для родительского каталога файла. В общем, чтобы программа не могла изменить файл, необходимо обеспечить разрешения как самого файла, так и его родительского каталога.
Когда родительский каталог недоступен для записи пользователем Vim
Однако даже в этом случае Vim по-прежнему старается помочь настойчивому пользователю перезаписать файл. Если пользователь Vim владеет файлом, Vim может обойти ограничение родительского каталога только для чтения, временно изменив разрешение файла (используя
chmod
системный вызов), записав буфер в файл, закрыв файл и изменив разрешения назад. Вот выдержка из системных вызовов, выполняемых при запуске vi через stracestrace -o ../vi.trace vi t
:Примечание. Этого не происходит, если пользователь Vim редактирует файл, владельцем которого он не является, поскольку Vim не сможет изменить права доступа к файлу.
добавление
Чтобы быть уверенным, что файл не может быть изменен (в системе GNU / Linux), запустите
chattr
команду как суперпользователь:От
man chattr
:источник
Большинство , если не все
vi
реализации мешает вам записать файл , если вы используете обычный сохранить команду как либоZZ
,:w
,:wq
или:x
, например , с помощьюvim
:С другой стороны, если вы скажете
vi
записывать файл, несмотря на его разрешения, используя что-то вроде:x!
или:wq!
, редактор временно ослабляет разрешения, чтобы разрешить запись файла :В этом случае номер индекса не изменяется.
Наконец, это не ошибка, так как если вам не разрешено изменять права доступа к файлу, вы не можете изменить его
vi
.источник