Używałem Vima jak zwykle, kiedy zauważyłem coś dziwnego. Oto co zrobiłem:
~$ touch testfile
~$ ls -l | grep testfile
-rw-r--r-- 1 username groupname 0 Jul 23 10:00 testfile
~$ vim testfile
Potem dokonałem zmiany, zapisałem i rzuciłem :wq
. Całkiem normalne. Potem jednak:
~$ 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
Tak więc root powinien mieć dostęp r / w, a wszyscy inni powinni tylko czytać. Edytuj plik, spróbuj zapisać - nie możesz. Niesamowite, działa zgodnie z przeznaczeniem. Jeśli jednak zapiszesz za pomocą :w!
, vim w jakiś sposób zmieni własność pliku z powrotem na nazwę użytkownika: grupa użytkowników i plik zostanie zapisany. Nawet jeśli to zrobisz:
~$ sudo chmod 444 testfile
~$ sudo -k
~$ ls -l | grep testfile
-r--r--r-- 1 root root 0 Jul 23 10:06 testfile
~$ vim testfile
Nadal możesz nadpisywać :w!
! Co się dzieje? W jaki sposób vim może złamać takie prawa własności i zgody na pliki? Spojrzałem na stronę pomocy w vimie, mówiąc :help :w
i znalazłem:
: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.
Nie byłem w stanie wcześniej napisać do pliku w vimie, kiedy nie powinienem, więc myślę, że sedno mojego pytania brzmi: w jaki sposób mogę sprawić, że plik nie będzie edytowalny przez vima i dlaczego nie jest oparty na pliku uprawnienia systemowe, jak się spodziewałem, i jakiego mechanizmu używa vim do edycji pliku, którego inni edytorzy (gedit, nano) nie mogą użyć?
EDYCJA: Komputer, na którym próbowałem tego, używa jądra Linux 3.15.5-2-ARCH. Numer wersji Vima to 7.4.373-1 i to ten zainstalowany przez pacman
- nie skompilowałem go od zera za pomocą specjalnych opcji.
CAP_CHOWN
jest wymagane, aby zadzwonić chown(2)
. Nawiasem mówiąc, mogę reprodukować na Debianie z vimem 7.4.