Я використовував 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
- я не збирав його з нуля з будь-якими спеціальними параметрами.
CAP_CHOWN
потрібно зателефонувати chown(2)
. До речі, я можу відтворити на Debian, з vim 7.4.