Zostanie rootem od wewnątrz Vima


72

Czasami zaczynam edytować pliki konfiguracyjne /etcza pomocą Vima, ale zapominam użyć go sudodo uruchomienia Vima. Nieuniknionym rezultatem jest to, że po zakończeniu edycji napotykam przerażające powiadomienie, że nie mam uprawnień do zapisania pliku.

Przeważnie zmiany są na tyle małe, że po prostu wychodzę z Vima i robię to wszystko jako root. Mógłbym oczywiście zapisać w lokalizacji, w której mogę pisać, a następnie kopiować jako root, ale jest to również trochę denerwujące.

Ale jestem pewien, że istnieje łatwiejszy sposób na rootowanie lub używanie sudoz poziomu Vima, bez konieczności odrzucania zmian. Gdyby metoda nie polegała na sudoskonfigurowaniu dla użytkownika, byłoby to jeszcze lepsze.


1
Mam zwyczaj używania sudoeditzamiast vimdo wszystkich edycji przez administratora. To jeden ze sposobów, aby nigdy więcej nie napotkać tego problemu :). +1 za odpowiedź Gillesa .
jw013

Te alternatywne pytania i odpowiedzi z SO są przydatne, więc łącząc się z nimi tutaj: Uzyskiwanie uprawnień roota do pliku w vi? & Jak działa sztuczka vima „pisz z sudo”? .
slm

Odpowiedzi:


46

sudo nie może zmienić faktycznego użytkownika istniejącego procesu, zawsze tworzy nowy proces, który ma podwyższone uprawnienia, a oryginalna powłoka pozostaje nienaruszona. Jest to fundament projektu UNIX. Najczęściej po prostu zapisuję plik do / tmp jako obejście. Jeśli naprawdę chcesz go zapisać bezpośrednio, możesz spróbować użyć funkcji Vima, w której może on potokować plik do innego procesu. Spróbuj zapisać za pomocą tego polecenia:

:w !sudo dd of=%

Testowane i działa. Vim poprosi cię o ponowne załadowanie pliku, ale nie jest to konieczne: możesz po prostu nacisnąć, oaby uniknąć ponownego załadowania i utraty historii cofania. Możesz nawet zapisać to w poleceniu / funkcji Vima lub nawet przypisać do klawisza dla łatwego dostępu, ale zostawię to jako ćwiczenie czytelnikowi.


2
To ciekawe rozwiązanie, ale możesz zastąpić ścieżkę %, która w vimie będzie ścieżką pliku, który aktualnie edytujesz.
Reid,

Powinieneś zawinąć %cudzysłowy, jeśli nazwa pliku zawiera spację.
intuicyjnie

Ponadto: nie spowoduje to zresetowania 'modified'ustawienia; możesz to zrobić ręcznie za pomocą set nomodified.
intuicyjnie

2
Właściwie, jeśli naprawdę chcesz być ostrożnym, należy zrobić exec 'w !sudo dd of=' . shellescape(expand('%'))w przypadku, gdy nazwa pliku zawiera cytaty, backslashy, znaki dolara, itp
przeczuwał

Czym różni się to od Commandlinefu-polecenia według plaes?


13

Zadzwoń, sudoeditaby edytować pliki jako root.

Pomyśl o niedogodnościach podczas vimbezpośredniego dzwonienia jako ostrzeżenia, że ​​jesteś zbyt swobodny w robieniu czegoś potencjalnie niebezpiecznego.



3

Działa to również dobrze:

:w !sudo sh -c "cat > %"

Jest to inspirowane komentarzem @Nathana Longa w tej odpowiedzi .

UWAGA :

"należy użyć zamiast tego, 'ponieważ chcemy %rozszerzyć przed przejściem do powłoki.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.