Vim може порушити дозволи файлів?


8

Я використовував 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

Отже, корінь повинен мати r / w доступ, а всі інші повинні мати лише читання. Відредагуйте файл, спробуйте зберегти - ви не можете. Дивовижна, працює за призначенням. Однак, якщо ви зберігаєте за допомогою :w!, vim якось змінює право власності на файл на ім'я користувача: 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 може порушувати закони щодо права власності на файли та такого дозволу? Я переглянув сторінку довідки in 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) не можуть використовувати?

EDIT: На комп'ютері, на якому я спробував це, використовується Linux ядро ​​3.15.5-2-ARCH. Номер версії Vim - 7.4.373-1, і він встановлений компанією pacman- я не збирав його з нуля з будь-якими спеціальними параметрами.


Я, здається, не в змозі відтворити проблему, якщо не скористатись певними хитрощами, як описано тут
Давижу

Я просто спробував це ще раз, використовуючи команди у питанні, і це сталося таким же чином. Я відредагую питання, щоб додати детальну інформацію про свій комп'ютер, хоча, мабуть, це може залежати від платформи.
zrneely

Перший мій погляд - це те, що ви можете змінювати право власності на файли в каталозі, до якого ви маєте доступ для запису. Але, здається , це не так . CAP_CHOWNпотрібно зателефонувати chown(2). До речі, я можу відтворити на Debian, з vim 7.4.
Боб

Відповіді:


10

Я бачу, що ваш поточний шлях - ~домашній каталог вашого користувача. Ви повинні мати дозволи на запис у цей каталог.

Подумайте про інший спосіб - якщо ви прочитали та записували дозволи в каталог, що вас заважає скопіювати файл, видалити старий і перейменувати новий з різними дозволами?

Це саме те, що робить vim!


Якщо ви запускаєте vim під напругою, наприклад:

open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = -1 EACCES (Permission denied)
lstat("testfile", {st_mode=S_IFREG|0644, st_size=10, ...}) = 0
getuid()                                = 1000
unlink("testfile")                      = 0
open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 3
write(3, "ffjidfjds\n", 10)             = 10
fsync(3)                                = 0
close(3)                                = 0
chmod("testfile", 0644)                 = 0

На основі цього журналу я можу здогадатися про наступний процес:

Деякі попередні перевірки дозволів (а також chownспроби тощо) для короткості недоступні.

  1. open Спроба відкрити файл для запису (помилка: дозвіл відхилено)
  2. lstat Перевірте власника файлу
  3. getuuid Перевірте ідентифікатор поточного користувача, щоб побачити, чи відповідає вони власнику файлу
  4. unlink Видаліть файл (це дозволено, оскільки дозвіл на запис у каталог)
  5. open Створіть новий файл з такою ж назвою
  6. write Вміст файлу (читати раніше, я набрав деякі хитрощі)
  7. fsync Заправити файл на диск (не дуже важливо)
  8. close
  9. chmod Змініть дозволи нового файлу так, щоб вони виглядали як старі - зараз, можливо, є новий власник.

Добре, дякую. Я радий, що я це зрозумів. Тож якщо у мене в каталозі немає дозволів на запис, я не зможу користуватися :w!, що має сенс.
zrneely

Також інформація про страйс справді зручна - тепер у мене є ще один інструмент для власних розслідувань у майбутньому.
zrneely

1
@zrneely Порада для strace: використання -oопції для запису виводу у файл; інакше це зіткнеться з vimвиходом s. Що стосується прав на запис, я не бачу , що перевірка дозволів каталогів , statале робить спробу створити файл ( з ім'ям 4913, здається випадковим) в поточному каталозі , а потім видалити його.
Боб

Схоже, 4913це насправді лише ім'я, яке він намагається, і його мета - перевірити, чи є у нього достатньо дозволів для цього. Дивіться: bugzilla.redhat.com/show_bug.cgi?id=427711#c6 та groups.google.com/forum/#!topic/vim_dev/sppdpElxY44
Боб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.