Как vim перезаписывает режим только для чтения? [дубликат]

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

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

В базовой версии, после того, как ваш сервер получит письмо с инструкциями, он затем отправит код подтверждения на ваш почтовый ящик (давайте оставим его создание в другой теме), для чего он будет ждать, пока вы его откроете. Только тогда он приступит к инструкциям, которые вы отправили в первом письме.

Это решение может иметь расширенные вариации. Одна из их частей - это операции с самим кодом. Еще один способ повысить безопасность - открыть новый канал связи. Вы можете подключить к серверу другое мобильное устройство, которое отправит вам код авторизации в виде SMS. Таким образом, вы также получите информацию в случае, если кто-то попытается отправить инструкции на ваш сервер.

23
25.02.2019, 12:09
3 ответа

Когда вы делаете w!в Vim, то, что на самом деле происходит, зависит от того, кому принадлежит файл.

  • Если вы (текущий пользователь )являетесь владельцем файла, Vim изменит разрешения на запись перед перезаписью файла. Затем он удаляет разрешения на запись, чтобы восстановить биты разрешений до того состояния, которое было с самого начала.

  • Если вы не являетесь владельцем файла, но у вас есть права на запись в текущем каталоге, Vim удалит исходный файл и запишет документ в новый файл с тем же именем. После этого новому файлу будут назначены те же разрешения, что и исходному файлу, но он будет принадлежать вам.

Vim никогда не получает повышенных привилегий для записи в файл.

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

Как видно из комментариев ниже, в приведенном выше есть некоторая путаница. Если вы хотите сами увидеть, что на самом деле происходит с вашей настройкой Vim на вашей конкретной марке Unix, я бы порекомендовал проследить системные вызовы, которые делает Vim во время записи в файл -только для чтения. Как это делается, зависит от того, какой Unix вы используете. В Linux это, вероятно, делается, например, через. strace vim file(, затем отредактируйте файл, сохраните его с помощью w!и выйдите ).


Это первый случай (вывода из ktrace+ kdumpв OpenBSD):

13228 vim      CALL  chmod(0x19b1d94b4b10,0100644<S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH|S_IFREG>)
13228 vim      NAMI  "file"
13228 vim      RET   chmod 0
13228 vim      CALL  lseek(3,0x1000,SEEK_SET)
13228 vim      RET   lseek 4096/0x1000
13228 vim      CALL  write(3,0x19b1e0aa9000,0x1000)

Это изменяет права доступа к файлу, чтобы он был доступен для записи (флаг S_IWUSR, используемый с chmod()), и записывает в него буфер.

Затем устанавливаются исходные разрешения:

13228 vim      CALL  fchmod(4,0100444<S_IRUSR|S_IRGRP|S_IROTH|S_IFREG>)
13228 vim      RET   fchmod 0
13228 vim      CALL  close(4)
13228 vim      RET   close 0

Для другого случая:

Сначала отменяет связь (удаляет )файл, а затем воссоздает его (перед записью в файл и последующим изменением разрешений):

44487 vim      CALL  unlink(0x79fdbc1f000)
44487 vim      NAMI  "file"
44487 vim      RET   unlink 0
44487 vim      CALL  open(0x79fdbc1f000,0x201<O_WRONLY|O_CREAT>,0644<S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH>)
44487 vim      NAMI  "file"
44487 vim      RET   open 4
26
27.01.2020, 19:41

Вы никогда не сможете писать в файл, на который у вас нет прав на запись. Однако вы можете удалить этот файл, если у вас есть права на запись в каталог.

Уловка, которую использует VIM, заключается в удалении файла и записи нового.

Можно показать, что этот метод использует VIM без чтения исходного кода, проверив номер инода до и после:

$ touch foo
$ chmod u-w foo
$ ls -li foo
60818465 -r--r----- 1 philip philip 0 Feb 25 10:24 foo
$ vi foo
$ # edit the file and save with :w!
$ ls -li foo
60818467 -r--r----- 1 philip philip 8 Feb 25 10:25 foo

Обратите внимание, что номер инода изменился, показывая, что новый файл НЕ является тем же файлом, что и тот, который вы редактировали.


К вашему сведению, моя текущая конфигурация очень короткая:

runtime! debian.vim
if has("syntax")
  syntax on
endif
set tabstop=4
set autoindent

Установлены пакеты Debian:

vim                               2:8.1.0875-1
vim-common                        2:8.1.0875-1
vim-runtime                       2:8.1.0875-1
vim-tiny                          2:8.1.0875-1
2
27.01.2020, 19:41

Vim не может получить дополнительные разрешения. :w!просто переопределяет внутреннюю опцию 'readonly', которая могла быть установлена, потому что:

  • вы открыли файл с помощью опции строки -Rкоманды -или с помощью :viewвместо :editили:setlocal readonly
  • Vim распознает, что файл в настоящее время не имеет прав на запись

В последнем случае запись в файл все еще может быть возможна, поскольку Vim (по умолчанию)создает новый файл , а затем заменяет им исходный файл. Это все еще зависит от разрешений, установленных таким образом, чтобы разрешить это.


Чтобы действительно получить права на запись там, где у пользователя, открывшего Vim, их нет, необходимо использовать :w !sudo tee >/dev/null fileтрюк либо напрямую, либо через плагин, такой как SudoEdit .

4
27.01.2020, 19:41

Теги

Похожие вопросы