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.

Szalony naukowiec
źródło
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.

penguin359
źródło
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?
36

Zapisywanie pliku jako root:

: w! sudo tee%

plaes
źródło
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.

Gilles
źródło
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.

feihu
źródło