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?
linux
vim
terminal
permissions
andor kesselman
źródło
źródło
Odpowiedzi:
Wydaje się, że istnieją różne podejścia, w zależności od bieżącego problemu:
:set readonly
, możesz:w!
aby wymusić zapis, lub:set noreadonly
a następnie użyj normalnego:w
:w !sudo tee %
. Spowoduje to zapisanie bufora dotee
polecenia, 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.:w! ~/tempfile.ext
aby 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:
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.źródło
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.
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
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:
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 „$”:
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.
źródło
Po prostu chcę uwzględnić przypadek, gdy nie ma uprawnień do zapisu pliku.
Pomiędzy vim będzie narzekał na zmiany w pliku (z powodu zmiany flag) - oczywiście można je zignorować
źródło
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 .źródło