Poniższy przykład pokazuje, jak utworzyć plik z tylko uprawnieniami do odczytu. Jak widać, przy próbie zapisu do tego pliku za pomocą polecenia echo I get Permission denied
.
Ale dlaczego, w przypadku, gdy używamy vi, nie otrzymujemy Permission denied
? Jak widać tutaj, możemy zapisać do pliku, nawet jeśli plik jest tylko do odczytu.
Co tu się dzieje? Czy to błąd vi?
[admin@madona-machine1 ~]$ touch test-file
[admin@madona-machine1 ~]$ ls -ltr
total 0
-rw-r--r-- 1 admin admin 0 Apr 13 07:32 test-file
[admin@madona-machine1 ~]$ chmod -w test-file
[admin@madona-machine1 ~]$ ls -ltr
total 0
-r--r--r-- 1 admin admin 0 Apr 13 07:32 test-file
[admin@madona-machine1 ~]$ echo try_to_write > test-file
-bash: test-file: Permission denied
[admin@madona-machine1 ~]$ vi test-file
I am good singer,
~
~
~
~
~
~
~
"test-file" 1L, 4C written
Odpowiedzi:
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
!
dow
polecenia. Jeśli używana jest ta wymuszona wersja polecenia zapisu, Vim usuwa oryginalny plik (jeśli używa Vima zbackup
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: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 stracestrace -o ../vi.trace vi t
: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:Od
man chattr
:źródło
Większość, jeśli nie wszystkie
vi
implementacje uniemożliwić napisać plik, jeśli używasz polecenia Zapisz regularny jak bądźZZ
,:w
,:wq
lub:x
, na przykład zvim
:Z drugiej strony, jeśli każesz
vi
napisać plik pomimo jego uprawnień, używając czegoś takiego jak:x!
lub:wq!
, edytor tymczasowo rozluźnia uprawnienia, aby umożliwić zapisanie pliku:W takim przypadku numer i-węzła pozostaje niezmieniony.
Wreszcie, nie jest to błąd, ponieważ jeśli nie możesz zmieniać uprawnień do plików, nie możesz go modyfikować
vi
.źródło