На днях я использовал Vim как обычно, когда заметил что-то странное. Вот что я сделал:
~$ touch testfile
~$ ls -l | grep testfile
-rw-r--r-- 1 username groupname 0 Jul 23 10:00 testfile
~$ vim testfile
Затем я внес изменения, сохранил и вышел с помощью :wq
. Довольно нормально. Затем, однако:
~$ sudo chown root:root testfile
~$ sudo chmod 644 testfile
~$ sudo -k
~$ ls -l | grep testfile
-rw-r--r-- root root 0 Jul 23 10:02 testfile
~$ vim testfile
Таким образом, root должен иметь доступ с правами на запись, а все остальные должны иметь только чтение. Отредактируйте файл, попробуйте сохранить - вы не можете. Круто, работает как задумано. Однако, если вы сохраните с помощью :w!
, vim каким-то образом изменит владельца файла обратно на username: usergroup, и файл будет сохранен. Даже если вы сделаете это:
~$ sudo chmod 444 testfile
~$ sudo -k
~$ ls -l | grep testfile
-r--r--r-- 1 root root 0 Jul 23 10:06 testfile
~$ vim testfile
Вы все еще можете перезаписать с :w!
! Что происходит? Как Vim может нарушить законы о владении файлами и разрешениях, как это? Я посмотрел на страницу помощи в VIM, сказав, :help :w
и нашел это:
:w[rite]! [++opt] Like ":write", but forcefully write when 'readonly' is set or there is another reason why writing was refused.
Note: This may change the permission and ownership of the file and break (symbolic) links. Add the 'W' flage to 'cpoptions' to avoid this.
Я не мог записать файл в vim ранее, когда не должен был, поэтому я предполагаю, что суть моего вопроса в том, как сделать файл недоступным для редактирования с помощью vim и почему он не основан на файле системные права, как я и ожидал, и какой механизм использует vim для редактирования файла, который другие редакторы (gedit, nano) не могут использовать?
РЕДАКТИРОВАТЬ: компьютер, на котором я попробовал это, использует ядро Linux 3.15.5-2-ARCH. Номер версии Vim - 7.4.373-1, и он установлен pacman
- я не собирал его с нуля с какими-либо специальными опциями.
CAP_CHOWN
требуется позвонить chown(2)
. Кстати, я могу воспроизвести на Debian, с vim 7.4.