vim ponownie edytuje jako root

28

Często otwieram plik w vimie, wprowadzam pewne zmiany, a kiedy nadszedł czas, aby zapisać plik, jest tylko do odczytu ... (własność innego użytkownika). Szukam wskazówek, jak mogę ponownie otworzyć plik jako root i zachować moje zmiany bez uprzedniego zapisania go w pliku tymczasowym do skopiowania lub ponownej edycji jako root.

rkthkr
źródło

Odpowiedzi:

42

Z tej odpowiedzi stackoverflow , przez skinp

:w !sudo tee %

Często zapominam sudo przed edycją pliku, na którym nie mam uprawnień do zapisu. Kiedy przychodzę zapisać ten plik i pojawia się błąd uprawnień, po prostu wydaje to polecenie vim, aby zapisać plik bez potrzeby zapisywania go w pliku tymczasowym, a następnie ponownie go kopiuję.

dbr
źródło
To już prawie
koniec
@rkthkr, jeśli „vim zrestartuje się i uruchomi się jako root”, nie będziesz mógł zapisać dokonanych zmian i stracisz historię cofania. Ale jeśli tego właśnie chcesz ... [Zabrakło znaków.] Zobacz „odpowiedź”, którą zamierzam napisać.
Bruno Bronosky
2
@dbr, myślę, że warto wspomnieć, że po zastąpieniu pliku (tee as sudo) pojawi się monit o [O] k lub [L] oad. Późniejsza opcja usunie historię cofania i zresetuje „zmodyfikowaną flagę”, umożliwiając wyjście bez ostrzeżenia o zapisaniu zmian. Ta pierwsza opcja, którą wolę, zachowa historię cofania, ale spowoduje ostrzeżenie podczas próby wyjścia. Musisz użyć: q! w tym przypadku wyjść. Robię to, aby móc sprawdzić (np .:! Sudo /etc/init.d/httpd configtest) i wycofać / reedytować, jeśli zajdzie taka potrzeba.
Bruno Bronosky,
15

Proszę, nie głosujcie na mnie za to. Nie polecam implementowania tej odpowiedzi, ale jest to odpowiedź, o którą prosi rkthkr.

rkthkr powiedział:
Ale byłoby miło, gdyby vim zrestartował się i działał jako root

Sposobem na to jest, :!sudo vim %
jak wspomniałem ipozgaj,% jako argument (nawet pod-argument) zostaje zastąpiony ścieżką do bieżącego bufora. (Może pojawić się monit o podanie hasła.) W efekcie powstaje nowy proces vim, którego właścicielem jest root, czyli proces potomny oryginalnego procesu vim. Brzmi głupio, prawda? Oto jak to wygląda w ps:

~# ps afo pid,ppid,user,stat,comm
  PID  PPID USER         STAT COMMAND
16187 30478 rbronosky    Ss   bash
16510 16187 rbronosky    R+    \_ ps
30482 30478 rbronosky    Ss   bash
16244 30482 rbronosky    S+    \_ vim
16318 16244 root         S+        \_ vim

Jeśli masz uprawnienia do zapisu do katalogu zawierającego plik i dokonałeś w nim edycji, możesz zostać ostrzeżony, że plik wymiany zostanie zamknięty. Wybór [R] ecover, odzwierciedla większość * zmian dokonanych przez proces vim nadrzędny. (* Myślę, że być może aktualizacja wymiany jest zaplanowana na czas lub ma próg delta. Włożyłem już w to zbyt dużo czasu i nie chcę tego badać.) Kiedy idziesz i rezygnujesz z vima, nie przejmuj się, gdy jesteś wciąż w vimie ... otworzyłeś drugi proces vim. Zapamiętaj?

Teraz, z tym wszystkim powiedziane ... Prawie nigdy bym tego nie zrobił. Może, gdybym nie miał wystarczającej lub zbyt dużej ilości kawy i zdałem sobie sprawę, że będę musiał edytować kilka kolejnych plików jako root ... mógłbym spróbować. Przez 14 lat administrowania systemami nigdy nie miałem. Ale dopóki nie wyraziłeś niezadowolenia z mojego preferowanego rozwiązania (które jest dokładnie tak, jak oferowane dbr), nigdy o tym nie myślałem.

Bruno Bronosky
źródło
Dzięki, Richard! Bardzo pouczające, dam ci +1 za to :)
rkthkr
To jest bardzo wysokiej jakości odpowiedź: po co głosować? +1 ode mnie też.
Mei
1
Dzięki @Richard Bronosky, w moim gvim nie jest możliwe wpisanie hasła sudo za pomocą, :w !sudo tee %więc myślę, że to dobra odpowiedź.
Eric Fortis
1

Zwykle zapisuję go w pliku tymczasowym w $ HOME / tmp / apache.conf (na przykład)

sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf

jest to dodatkowa praca nad scaleniem zmian, ale się opłaciła. Uważam, że jest to przyjemny sposób między wygodą a pomiarami przeciw niepożądanym zmianom

Wcześniej myślałem o listach ACL lub przypisywaniu odpowiednich grup do plików, ale to nie działało zbyt często, albo albo zapomniałem zmienić właściciela, albo zmieniłem pliki tam, gdzie nie chciałem tego robić.

Dotyczy to tylko plików, które do tej pory nie były zarządzane. Ogólnym rozwiązaniem, którego używamy, jest marionetka z repozytorium git, w którym ludzie lokalnie edytują pliki i testują zmiany na odpowiednich serwerach, jeśli konfiguracja działa zgodnie z potrzebami, zmiany są wypychane z powrotem do centralnego repozytorium, w którym nasz silnik konfiguracyjny pobiera zmiany w regularnych odstępach czasu.

Serverhorror
źródło
0

To, co zwykle robię - niekoniecznie najszybszy, ale z pewnością bezpieczny - to zrobić coś takiego (używając przykładu nsswitch.conf):

:w! ~/%

Wyjdź z vima, a następnie wykonaj:

sudo vim nsswitch.conf
1GdG
:r ~/%

Spowoduje to usunięcie wszystkich wierszy i odczytanie zmienionej i zaktualizowanej wersji do edycji w jej miejscu. Korzystanie z katalogu domowego oznacza, że ​​nie musisz myśleć o tym, czy masz dostęp, czy nie - i jest to bardziej prywatne niż / tmp. Pamiętaj, że jest to zastąpienie całego pliku: jeśli nie chcesz dodawać wszystkich zmian, musisz wybrać i wybrać.

Pomimo bólu głowy związanego z którąkolwiek z tych odpowiedzi, nie ma powodu, aby stracić zmiany.

Mei
źródło