На днях я использовал 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.Ответы:
Я вижу, что ваш текущий путь -
~
домашний каталог вашего пользователя. У вас должны быть разрешения на запись в этот каталог.Подумайте об этом по-другому - если у вас есть права на чтение и запись для каталога, что мешает вам скопировать файл, удалить старый и переименовать новый с другими разрешениями?
Это именно то, что делает Vim!
Если вы запускаете vim под strace, например:
Основываясь на этом журнале, я могу догадаться о следующем процессе:
Некоторые более ранние проверки прав доступа (и
chown
попытки и т. Д.) Для краткости опущены.open
Попытка открыть файл для записи (ошибка: разрешение запрещено)lstat
Проверьте владельца файлаgetuuid
Проверьте текущий идентификатор пользователя, чтобы увидеть, соответствуют ли они владельцу файлаunlink
Удалить файл (это разрешено, потому что разрешение на запись в каталог)open
Создайте новый файл с тем же именемwrite
Содержимое файла (читай раньше, я набрал немного тарабарщины)fsync
Записать файл на диск (не очень важно)close
chmod
Измените права доступа к новому файлу так, чтобы он выглядел как старый - у него просто появился новый владелец.источник
:w!
, что имеет смысл.strace
: используйте-o
опцию для записи вывода в файл; в противном случае это вступает вvim
противоречие с выходом России. Что касается прав на запись, я не вижу , что проверка разрешений каталогов ,stat
но делает попытку создать файл ( с именем4913
, кажется случайным) в текущем каталоге , а затем удалить его.4913
самом деле это просто первое имя, которое он пытается, и его цель - проверить, достаточно ли у него разрешений для этого. См .: bugzilla.redhat.com/show_bug.cgi?id=427711#c6 and groups.google.com/forum/#!topic/vim_dev/sppdpElxY44