Krótkie pytanie:
Dlaczego możemy manipulować plikiem tylko do odczytu w Vimie, używając :+ w+ q+, !nawet nie będąc administratorem?
Długie pytanie:
Mam plik tekstowy (myFile.txt), który jest przeznaczony tylko do odczytu dla wszystkich:
navid@navid-ThinkPad-T530:~/ubuntuTest$ ls -l myFile.txt
-r--r--r-- 1 navid navid 26 Aug 22 21:21 myFile.txt
Mogę go otworzyć za pomocą Vima bez uprawnień administratora:
navid@navid-ThinkPad-T530:~/ubuntuTest$ vi myFile.txt
Modyfikuję go i naciskam: Esc+ :+ w+ q+ Enteri widzę ten komunikat o błędzie:
E45: 'readonly' option is set (add ! to override)
Jak dotąd wszystko ma sens. Ale kiedy naciskam: Esc+ :+ w+ q+ !+ Enter, Vim zapisuje zmiany.
Używam Ubuntu 16.04 i VIM 7.4.
command-line
permissions
vim
chmod
read-only
Navid Vafaei
źródło
źródło
Modifying a file and replacing a file are two different things
Odpowiedzi:
Jak już wspomniano w @Rob , możesz to zrobić tylko wtedy, gdy masz dostęp do zapisu do katalogu zawierającego plik. Na przykład próba zrobienia tego samego dla pliku,
/etc
zakończy się niepowodzeniem.Jeśli chodzi o to, jak
vim
to robi, usuwa plik i odtwarza go. Aby to przetestować, utworzyłem plik należący do roota:Następnie przystąpiłem do edycji pliku
vim
w sposób opisany, ale dołączając proces,strace
aby zobaczyć, co się dzieje:Następnie sprawdziłem
strace.out
i znalazłem:Tak więc plik został najpierw usunięty (
unlink("fff")
), a następnie utworzono nowy plik o tej samej nazwie (open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644)
) i zapisano w nim modyfikacje (write(4, "foasdasdao\n", 11)
). Jeśli spróbujesz tego w domu, zobaczysz, że po edycji za pomocąvim
, plik będzie należeć do ciebie, a nie do rootowania.Ściśle mówiąc,
vim
nie edytuje pliku, do którego nie masz uprawnień do zapisu. Usuwa plik z katalogu, do którego masz dostęp do zapisu, a następnie tworzy nowy plik, do którego znowu masz dostęp do zapisu.źródło
rename(2)
do zastąpienia starego pliku. Wtedy nie ma okna czasowego, w którym dane nie istnieją na dysku.Tak długo, jak jesteś właścicielem katalogu nadrzędnego, możesz usunąć lub zastąpić plik bez względu na uprawnienia, ponieważ możesz zmienić zawartość katalogu :).
Spróbuj użyć innej komendy, takiej jak rm, wyświetli się monit, ale nadal możesz to zrobić. Niech katalog nie będzie zapisywalny i to powinno go zatrzymać.
Dodanie:
Właśnie go wypróbowałem, ale dopóki jestem właścicielem pliku, nadal mogę go modyfikować, nawet z folderem tylko do odczytu. Jednak po zmianie właściciela na root: root nie można otworzyć pliku do zapisu. Rozwiązuje więc modyfikowanie plików należących do roota (lub kogoś innego)
źródło
Za pomocą
w!
usuwasz oryginalny plik ( co możesz robić ) i piszesz wersję.Gdy masz dostęp do zapisu do katalogu, możesz: tworzyć, przenosić lub usuwać pliki w tym katalogu.
Teraz pozwól mi zmienić mojego użytkownika i zmienić plik
Teraz zobacz, co tam jest:
źródło
Zobacz
:help write-readonly
:Ponieważ masz uprawnienia do zapisu w katalogu (co oznacza, że możesz w nim tworzyć, usuwać lub zmieniać nazwy plików), system na to zezwala.
Wartość domyślna
cpoptions
nie zawieraW
:źródło
Jest to ostrzeżenie VIM, które może być stosunkowo ważne, biorąc pod uwagę sposób działania uprawnień w systemie UNIX. Pozorna niekonwencjonalność tego wynika z faktu, że systemy plików UNIX mają uprawnienia do pliku przechowywanego w i-węźle pliku. Struktura katalogów jest jakoś osobna i łączy tylko te i-węzły. Katalogi mają również swoje uprawnienia, które mówią, czy można do nich podłączać / odłączać pliki, czy czytać je, czy przechodzić do podkatalogów. Taka konstrukcja pozwala na pojawienie się tego samego pliku w kilku różnych miejscach w strukturze katalogów (poprzez twarde linki). Mówiąc „dodaj! Zastąpić” VIM próbuje ostrzec cię, że oryginalny plik zostanie rozłączony (więc pozostanie nietknięty we wszystkich innych miejscach), a nowy plik zostanie utworzony i połączony z oryginalnym miejscem w strukturze katalogów. W przypadku, gdy liczba linków oryginalnego pliku zmniejszy się do zera, oryginalny plik zostanie zwolniony, ale jeśli nie, skutecznie klonujesz plik. Otwarcie pliku jest również liczone jako link, więc jeśli jakiś program otworzył plik i wyrazisz zgodę na „dodaj! Zastąpić”, program nie zobaczy zmian wprowadzonych do pliku przez Ciebie za pomocą VIM. Plik zostanie odłączony od katalogu tylko przez VIM, a po zamknięciu go przez inny program, plik zostanie zwolniony, chyba że zostanie połączony gdzie indziej.
Należy pamiętać, że w systemie Windows uprawnienia do plików są przechowywane w katalogu, więc z punktu widzenia paradygmatu uprawnień systemu Windows takie zachowanie vima może wyglądać dziwnie. Podczas zapisywania do pliku system Windows logicznie może również sprawdzić niektóre uprawnienia do katalogu, nawet uprawnienia do super-katalogu. Jak wspomniano powyżej, w systemie UNIX uprawnienia do katalogu nie mają znaczenia przy manipulowaniu plikiem, o ile można go było wyświetlić i otworzyć (tzn. Dla wszystkich super-katalogów było x). Plik otwarty w systemie UNIX może nawet nie mieć nazwy, jeśli po otwarciu został odłączony od wszystkich katalogów.
Na przykład, masz plik / home / user1 / foo i jest to ten sam plik, co (tzn. Podłączony do linku) / home / user2 / foo, a plik nie jest zapisywalny przez nikogo i obecnie otwarty przez program P (otwarty do odczytu i zapisu przez program uruchomiony przez root). Jeśli użytkownik1 otworzy go za pomocą vima i nadpisze, tworzy własną kopię i nie widzi już oryginalnego pliku. Jeśli następnie użytkownik2 otworzy swój link za pomocą vima i zapisze się w nim, zostanie on rozłączony ponownie i utworzy kolejną kopię. Program P nadal zobaczy oryginalny plik i może swobodnie w nim czytać lub zapisywać. Gdy tylko program zamknie plik, plik zniknie (zostanie zwolniony przez system plików).
źródło
Zarówno proces edytora vim, jak i plik zawierają
własność, abyś mógł również wyrzucić
i możesz się domyślać, że kiedyś jeszcze prostsze
(wymaganie tylko + w, ut unlink na., a nawet własność) stało się zbyt częste, aby ktoś mógł pisać, więc vim został przeprogramowany, aby automatycznie oferować i na żądanie automatycznie wykonać taką operację.
Spróbuj zastąpić starszą siostrę
jak zwykłe navid i zakłady są twoje vim daje pożądaną odmowę.
źródło
To nie jest dokładnie odpowiedź, ale jeśli naprawdę chcesz ustawić plik, aby nikt nie mógł go zmienić ani usunąć, możesz uczynić go niezmiennym.
Zwykle nawet jeśli plik należy do katalogu głównego, nadal możesz go usunąć, jeśli masz uprawnienia do zapisu w folderze. Ale kiedy uczynisz plik niezmiennym, nawet root nie będzie mógł go modyfikować ani usuwać.
Aby plik był niezmienny (potrzebujesz
sudo
):Możesz to zobaczyć za pomocą
lsattr
(literyi
w wyniku):Aby przywrócić normalny plik:
Wyjaśnienie: Gdy plik jest niezmienny, nie można go usunąć, zmienić jego nazwy, zmodyfikować, a nawet połączyć na stałe.
Warto przeczytać
man chattr
, ponieważ pliki mogą mieć wiele przydatnych atrybutów.Przydatne może być również „ograniczone usuwanie”. Jeśli zostanie umieszczony w folderze (nie pliku), oznacza to, że ktokolwiek tworzy plik w folderze, może modyfikować lub usuwać ten plik, ale nikt inny nie jest (z wyjątkiem root). Folder
/tmp
ma ustawioną tę flagę. Możesz to zobaczyć zt
flagą na/tmp
:Aby ustawić lub usunąć flagę ograniczonego usuwania w folderze:
źródło