Примітка : Через застарілі причини ліцензування більшість дистрибутивів GNU / Linux не включає оригінальну програму vi, як написав Білл Джой. Натомість команда vi надається за допомогою запуску Vim у режимі сумісності vi. Наступна відповідь заснована на запуску Vim в режимі сумісності з vi.
Модифікація файлу лише для читання
Вім попереджає користувача , якщо вони змінюють буфер файлу тільки для читання, W10: Warning: Changing a readonly file
. Якщо користувач намагається писати в цей файл, вони отримують таке повідомлення про помилку, 'readonly' option is set (add ! to override)
.
Коли батьківський каталог записується користувачем Vim
В'ю, будучи корисним, дозволяє користувачеві знати , що вони можуть рішуче наполягати на написання, додаючи знак оклику, !
до w
команді. Якщо використовується ця силова версія команди запису, Vim видаляє вихідний файл (якщо Vim використовує з backup
набором параметрів лише Vim , оригінальний файл насправді перейменований на такий самий, як файл резервного копіювання). Потім він відкриває (створює) новий файл з тим же ім'ям , що і оригінал, і записує вміст його буфера в цей новий файл. Це можна помітити, перевіривши inode файлу до та після запуску Vim:
$ ls -l --inode t
131529 -r--r--r-- 1 anthony anthony 0 Apr 13 09:23 t
$ vi t
$ ls -l --inode t
131649 -r--r--r-- 1 anthony anthony 4 Apr 13 09:23 t
Примітка. Це також може змінити дозвіл та право власності на файл та розірвати (символічні) посилання, наприклад, якщо оригінальний файл належав іншому користувачеві, новий файл належав би користувачеві, який працює під управлінням Vim.
Процес може зробити це лише в тому випадку, якщо він має дозвіл на запис для батьківського каталогу файлу. Загалом, для того, щоб програма не могла змінювати файл, повинні бути захищені права як самого файлу, так і його батьківського каталогу.
Коли батьківський каталог не може бути записаний користувачем Vim
Однак навіть у цьому випадку Vim все ще робить все можливе, щоб допомогти наполегливому користувачеві перезаписати файл. Якщо користувач Vim має право власності на файл, Vim може обійти обмеження батьківського каталогу лише для читання, тимчасово змінивши дозвіл на файл (використовуючи chmod
системний виклик), записавши буфер у файл, закривши файл та змінивши дозволи назад. Ось витяг із системних дзвінків, здійснених під час запуску vi через strace strace -o ../vi.trace vi t
:
getuid() = 501
chmod("t", 0100644) = 0
open("t", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "I am good singer,\n", 18) = 18
fsync(4) = 0
close(4) = 0
chmod("t", 0100444) = 0
Примітка: цього не відбувається, якщо користувач Vim редагує файл, на який він не має права власності, оскільки Vim не зможе змінити дозволи файлів.
Додаток
Щоб бути впевненим, що файл неможливо змінити (у системі GNU / Linux), запустіть chattr
команду як суперпользователь:
sudo chattr +i filename
Від man chattr
:
Файл з атрибутом 'i' неможливо змінити: його неможливо видалити чи перейменувати, не може бути створено посилання на цей файл, а також дані не можуть бути записані у файл. Лише суперпользователь або процес, що володіє функцією CAP_LINUX_IMMUTABLE, може встановити або очистити цей атрибут.