Многое изменилось с тех пор, как был задан этот вопрос, но, возможно, этот ответ дает полезный подход.
Простая обработка почты, о которой вы спрашиваете, открывает брешь в безопасности, как отмечали другие. Но вы можете залатать эту дыру с помощью дополнительного шага подтверждения.
В базовой версии, после того, как ваш сервер получит письмо с инструкциями, он затем отправит код подтверждения на ваш почтовый ящик (давайте оставим его создание в другой теме), для чего он будет ждать, пока вы его откроете. Только тогда он приступит к инструкциям, которые вы отправили в первом письме.
Это решение может иметь расширенные вариации. Одна из их частей - это операции с самим кодом. Еще один способ повысить безопасность - открыть новый канал связи. Вы можете подключить к серверу другое мобильное устройство, которое отправит вам код авторизации в виде SMS. Таким образом, вы также получите информацию в случае, если кто-то попытается отправить инструкции на ваш сервер.
Когда вы делаете 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
Вы никогда не сможете писать в файл, на который у вас нет прав на запись. Однако вы можете удалить этот файл, если у вас есть права на запись в каталог.
Уловка, которую использует 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
Vim не может получить дополнительные разрешения. :w!
просто переопределяет внутреннюю опцию 'readonly'
, которая могла быть установлена, потому что:
-R
команды -или с помощью :view
вместо :edit
или:setlocal readonly
В последнем случае запись в файл все еще может быть возможна, поскольку Vim (по умолчанию)создает новый файл , а затем заменяет им исходный файл. Это все еще зависит от разрешений, установленных таким образом, чтобы разрешить это.
Чтобы действительно получить права на запись там, где у пользователя, открывшего Vim, их нет, необходимо использовать :w !sudo tee >/dev/null file
трюк либо напрямую, либо через плагин, такой как SudoEdit .