Как пользователь может редактировать файл, даже когда бит записи отключен в файле

Вот что я просто хотел поиграть с umask на моей тренировочной машине.

Я создал тестового пользователя john и вошел в систему, используя john. и установил umask на 0200 и создал тестовый файл в vim и сохранил его. Теперь разрешения для этого тестового файла

-r--rw-rw-. 1 john john 26 Jun 28 12:25 testfile 

Теперь я снова попытался отредактировать файл и ввел несколько тарабарских слов.

Теперь, когда я пытаюсь сохранить, используя редактор «: wq», говорит, что файл является readonly и не может быть сохранен. Но когда я добавил восклицательный знак в конце ": wq!" он сохранил файл.

Что сейчас произошло ?? даже когда бит записи отключен в тестовом файле

Host OS = RedHat (rhel) 7.2

С «wq», «!» просит Vim игнорировать атрибут только для чтения. Из документации :

: wq [++ opt] Записать текущий файл и выйти. Запись не выполняется, если файл доступен только для чтения или буфер не имеет имени. Выход завершается с ошибкой, когда последний файл в списке аргументов не редактировался.

: WQ! [++ opt] Записать текущий файл и выйти. Запись не выполняется, когда текущий буфер не имеет имени.

Обратите внимание на разницу: без «!», «Не удается, когда файл доступен только для чтения …»; которое больше не применяется к «!».

Что касается того, почему это происходит технически, поскольку вы являетесь владельцем файла, Vim может эффективно игнорировать разрешения на него (в худшем случае он может их изменить и восстановить ). На практике Vim поддерживает несколько способов записи файлов только для чтения:

  • если каталог доступен для записи, он переименует существующий файл (добавляет ~ к его имени), создаст новый файл, напишет новое содержимое в этот файл и восстановит разрешения исходного файла (это работает, даже если пользователь, на котором работает Vim isn ' t владелец файла);
  • если каталог не доступен для записи, он сделает резервную копию файла в доступном для записи каталоге (обычно ~/tmp ), измените разрешения файла, чтобы сделать его доступным для записи, записать новое содержимое в файл и восстановить его исходные разрешения ( работает только если пользователь Vim является владельцем файла).

В моем ответе я не буду заниматься с Вимом, а вместо этого посмотрю на основные механизмы, на которые вы наткнулись. Важно понимать их, поскольку это влияет на безопасность всей вашей системы.

Это не имеет ничего общего с владельцем: попробуйте, сделайте файл не принадлежащим вам, а затем дайте самому себе читать, а не пишите. Вы получите те же результаты. Так почему же это?

(хотя это возможно, будучи владельцем, root или имеющим возможности CAP_CHOWN, CAP_DAC_OVERRIDE или CAP_FOWNER, возможно, другие).

Это из-за разрешения каталога. Каталог можно записывать, поэтому vim может удалить файл, и он может добавить файл. Поэтому это то, что он делает. Он удаляет старое и заменяет его новым. Это делает бит бит в файле главным образом консультативным (хотя и не в том случае, если в каталоге нет записи).

Вероятно, это безопаснее, чем это: переместить старый, создать новый, удалить старый.