Uwaga : Ze względu na starsze licencje większość dystrybucji GNU / Linux nie zawiera oryginalnego programu vi, napisanego przez Billa Joya. Zamiast tego polecenie vi jest uruchamiane przez uruchomienie Vima w trybie zgodności vi. Poniższa odpowiedź oparta jest na uruchomieniu Vima w trybie zgodności z vi.
Modyfikowanie pliku tylko do odczytu
Vim ostrzega użytkownika, jeśli one modyfikować bufor pliku tylko do odczytu, W10: Warning: Changing a readonly file
. Jeśli użytkownik próbuje pisać do tego pliku, ale pojawia się następujący komunikat o błędzie 'readonly' option is set (add ! to override)
.
Gdy katalog nadrzędny jest zapisywalny przez użytkownika Vima
Vim, będąc pomocnym, informuje użytkownika, że może zdecydowanie nalegać na pisanie, dodając wykrzyknik !
do w
polecenia. Jeśli używana jest ta wymuszona wersja polecenia zapisu, Vim usuwa oryginalny plik (jeśli używa Vima z backup
zestawem opcji tylko dla Vima , nazwa oryginalnego pliku jest faktycznie zmieniana na taką samą jak plik kopii zapasowej). Następnie otwiera (tworzy) nowy plik o tej samej nazwie co oryginał i zapisuje zawartość bufora w tym nowym pliku. Można to zaobserwować sprawdzając i- węzeł pliku przed i po uruchomieniu Vima:
$ 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
Uwaga: może to również zmienić uprawnienia i własność pliku oraz zerwać (symboliczne) łącza, np. Jeśli oryginalny plik był własnością innego użytkownika, nowy plik byłby własnością użytkownika uruchamiającego Vima.
Proces może to zrobić tylko wtedy, gdy ma uprawnienia do zapisu dla katalogu nadrzędnego pliku. Zasadniczo, aby upewnić się, że program nie może zmodyfikować pliku, należy zabezpieczyć uprawnienia zarówno do samego pliku, jak i jego katalogu nadrzędnego.
Gdy katalog nadrzędny nie jest zapisywalny przez użytkownika Vima
Jednak nawet w tym przypadku Vim nadal dokłada wszelkich starań, aby uporczywy użytkownik nadpisał plik. Jeśli użytkownik Vima jest właścicielem pliku, Vim może obejść ograniczenie katalogu nadrzędnego tylko do odczytu, tymczasowo zmieniając uprawnienia do pliku (za pomocą chmod
wywołania systemowego), zapisując bufor do pliku, zamykając plik, a następnie zmieniając uprawnienia z powrotem. Oto fragment wywołań systemowych wykonanych podczas uruchamiania vi przez 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
Uwaga: Nie dzieje się tak, jeśli użytkownik Vima edytuje plik, do którego nie ma prawa własności, ponieważ Vim nie będzie mógł zmienić uprawnień do pliku.
Uzupełnienie
Aby mieć pewność, że pliku nie można zmodyfikować (w systemie GNU / Linux), uruchom chattr
komendę jako administrator:
sudo chattr +i filename
Od man chattr
:
Pliku z atrybutem „i” nie można modyfikować: nie można go usunąć ani zmienić jego nazwy, nie można utworzyć łącza do tego pliku i nie można zapisać danych w pliku. Tylko superużytkownik lub proces posiadający zdolność CAP_LINUX_IMMUTABLE może ustawić lub usunąć ten atrybut.