Używanie vima do wymuszenia edycji pliku, gdy otwierasz go bez uprawnień

51

Korzystam z vima do edycji pliku. Czasami zapominam o odpowiednich uprawnieniach. Uruchamiam vim i plik jako plik tylko do odczytu. Mogę wprowadzać zmiany, ale tak naprawdę nie mogę ich zapisać. Co jakiś czas kończę otwieranie pliku i wprowadzanie w nim zmian, zdaję sobie sprawę, że nie uruchomiłem go w sudo, krzyczę do siebie, a następnie zmuszam do wyjścia i otwierania go ponownie jako użytkownik root.

Czy można to obejść? Czy mogę wymusić zmiany w pliku pomimo statusu pliku tylko do odczytu? Czy mogę przynajmniej zapisać zmiany, uruchomić diff i scalić pliki razem?

andor kesselman
źródło
3
Odpowiedź na to pytanie jest już dostępna tutaj: stackoverflow.com/questions/1005/…
Jesienny
Przepraszam. Nie znalazłem tej odpowiedzi. Dziękuję Ci.
andor kesselman
3
Skorzystaj z [Vim write with sudo trick] [1]: w! Sudo tee% [1]: stackoverflow.com/questions/2600783/…
Mattias Åslund

Odpowiedzi:

80

Wydaje się, że istnieją różne podejścia, w zależności od bieżącego problemu:

  1. Tylko do odczytu przez vi. Jeśli masz plik :set readonly, możesz
    • Użyj, :w!aby wymusić zapis, lub
    • Problem, :set noreadonlya następnie użyj normalnego:w
  2. Pozwolenie problemem ( sudo ): nie można napisać, ale masz prawa sudo.
    • Problem: :w !sudo tee %. Spowoduje to zapisanie bufora do teepolecenia, które odbiera informacje o potoku i może zapisywać do plików. Ponieważ tee działa z mocami sudo, tee może modyfikować plik.
  3. Pozwolenie problemem ( nie sudo ): nie masz uprawnień do zapisania pliku i nie masz uprawnienia administratora.
    • Użyj, :w! ~/tempfile.extaby zapisać zmiany w pliku tymczasowym, a następnie podjąć środki, aby przenieść plik tymczasowy do katalogu (wyślij plik tymczasowy do właściciela katalogu / administratora).

Możesz przeczytać więcej na ten temat tutaj:

  1. Od StackOverflow
  2. Od Geekyboya
  3. Z Agaric danych

Skrót

Ponieważ często występuje problem nr 2 ( problem z uprawnieniami , w sudo ), możesz przejść do /etc/vim/vimrc(lub ~/.vimrc) następującego skrótu:

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

Następnie możesz po prostu wpisać, :w!!aby zapisać za pomocą mocy sudo . Nie wyjaśnię tego tutaj, ale powyższe odniesienia dotyczą wielu skrótów.

Dr Beco
źródło
I z twoim anonimowym, jakbym właśnie zdobył odznakę nekromanty! Dzięki! Mam teraz ochotę bronić Mordoru. ;)
Dr Beco
5

Mogę wymyślić dwa sposoby, aby to zrobić.

Pierwszy sposób zakłada, że ​​plik należy do Ciebie, ale plik jest ODCZYTOWY.

Wystarczy użyć sufiksu wykrzyknika vi w poleceniu write (: w!), Aby wymusić zastąpienie własnego pliku READONLY. Zakłada się oczywiście, że masz uprawnienia do pisania i wykonywania w bieżącym folderze.

:w!

spowoduje, że vi zastąpi oryginalny plik READONLY.

Drugi sposób zakłada, że ​​ktoś jest właścicielem pliku i chcesz zapisać zmiany w tym pliku.

Jednym ze sposobów osiągnięcia tego jest zapisanie zmian dokonanych w oryginalnym pliku jako skryptu ed z poziomu vi. Ten skrypt ed można zastosować do oryginalnego pliku (lub innych podobnych plików) w późniejszym czasie poza vi za pomocą edytora linii ed.

Sposobem na zapisanie bieżącej sesji edycji jako skryptu ed jest przekazanie oryginalnej nazwy pliku i edytowanego bufora vi jako standardowego wejścia do narzędzia diff za pomocą przełącznika wiersza poleceń --ed, tj. Wyświetlanie różnic jako skryptu ed.

Zakładając edytowany bufor vi, wykonaj następujące czynności

:.,$!diff --ed [original_file] -

Zastępuje to wszystkie wiersze w bieżącym buforze (., $!) Skryptem ed wygenerowanym przez diff (diff --ed [oryginalny_plik] -) niezbędny do przekonwertowania oryginalnego pliku na zawartość bieżącego bufora. Następnie chcemy zapisać ten edytowany skrypt w bezpiecznym miejscu i zastosować skrypt do wersji oryginalnego pliku, do którego możemy zapisać. Tak więc zapisz skrypt w bezpiecznej lokalizacji, na przykład w folderze logowania:

:w ~/my_ed_script

Teraz zamknij vi i użyj tego skryptu ed, aby uzyskać edytowany plik, którego nie można zapisać w pierwszej kolejności. Oto jak to zrobić z wiersza poleceń bash „$”:

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

To, co ta sekwencja komend robi w słowach, to catenatowanie skryptu, który wygenerowaliśmy z diff, i echo komendy ed write, „w”, na standardowe wejście ed. Następnie Ed stosuje ten skrypt do zapisywalnej kopii oryginalnego pliku i zapisuje te zmodyfikowane zmiany bufora z powrotem do pliku.

Jest to więc sposób na zapisanie pracy wykonanej w vi do pliku, który pierwotnie był własnością innej osoby używającej vi, diff i ed.

Billy McCloskey
źródło
1

Po prostu chcę uwzględnić przypadek, gdy nie ma uprawnień do zapisu pliku.

:!chmod +w %
:w!

Pomiędzy vim będzie narzekał na zmiany w pliku (z powodu zmiany flag) - oczywiście można je zignorować

yatsa
źródło
0

Inną możliwością, w przypadku gdy nie masz uprawnień sudo, jest użycie :w /somewhere/where/i/have/permissions/foo.txt, a następnie rozwiązanie problemu z uprawnieniami później, zgodnie z Ryan Fox .

Jonathan Ben-Avraham
źródło