Często podczas edycji plików konfiguracyjnych otwieram jeden z vi, a potem, kiedy go zapisuję, zdaję sobie sprawę, że nie wpisałem
sudo vi filename
Czy jest jakiś sposób nadania vi sudo uprawnień do zapisania pliku? Wydaje mi się, że coś o tym pamiętam, gdy jakiś czas temu szukałem informacji na temat vi, ale teraz nie mogę tego znaleźć.
Odpowiedzi:
%
zostaje zastąpiony bieżącą nazwą pliku, więc możesz użyć:(
vim
wykryje, że plik został zmieniony i zapyta, czy chcesz go ponownie załadować. Powiedz tak, wybierając[L]
raczej niż OK.)Jako skrót możesz zdefiniować własne polecenie. Umieść w swoim
.vimrc
:Za pomocą powyższego możesz wpisać,
:W<Enter>
aby zapisać plik. Odkąd to napisałem, znalazłem lepszy sposób (moim zdaniem), aby to zrobić:W ten sposób możesz pisać,
:w!!
a zostanie ono rozwinięte do pełnego wiersza poleceń, pozostawiając kursor na końcu, dzięki czemu możesz zastąpić%
własną nazwą pliku, jeśli chcesz.źródło
sudo: 1 incorrect password attempt
/etc/sudoers
plik, dodaćyour_username ALL=(ALL) ALL
pod liniąroot ALL=(ALL) ALL
, wyjść i zapisać.visudo
.Zasadniczo nie można zmienić efektywnego identyfikatora użytkownika procesu vi, ale można to zrobić:
źródło
:w !sudo tee % >/dev/null
lub:w !sudo dd of=%
unikaj echa zawartości pliku podczas zapisywania pliku.tee
i zobaczyłem, że jest to polecenie potoku Unix, i!
wstawia polecenie powłoki. Czy:w
zapisywanie jest obecnie standardowe, przez co jest przesyłanetee
?Wspólne zastrzeżenia
Najczęstszą metodą obejścia problemu z plikiem tylko do odczytu jest otwarcie potoku do bieżącego pliku jako superużytkownik za pomocą implementacji
sudo tee
. Jednak wszystkie najpopularniejsze rozwiązania, które znalazłem w Internecie, mają kombinację kilku potencjalnych zastrzeżeń:Rozwiązania
Aby obejść wszystkie te problemy, możesz użyć następującego polecenia:
Można je z szacunkiem skrócić:
Wyjaśnienie
:
rozpoczyna polecenie; musisz wpisać ten znak w trybie normalnym, aby rozpocząć wprowadzanie polecenia. Należy to pominąć w skryptach.sil[ent]
pomija dane wyjściowe polecenia. W takim przypadku chcemy zatrzymaćPress any key to continue
monit podobny do polecenia, który pojawia się po uruchomieniu:!
polecenia.exec[ute]
wykonuje ciąg jako polecenie. Nie możemy tak po prostu uruchomić,:write
ponieważ nie przetworzy wymaganego wywołania funkcji.!
reprezentuje:!
polecenie: jedyne polecenie, które:write
akceptuje. Zwykle:write
akceptuje ścieżkę do pliku, do którego należy zapisać.:!
samodzielnie uruchamia polecenie w powłoce (na przykład przy użyciubash -c
). Za pomocą:write
uruchomi polecenie w powłoce, a następnie zapisze cały plik dostdin
.sudo
powinno być oczywiste, ponieważ właśnie dlatego tu jesteś. Uruchom polecenie jako superużytkownik. W sieci jest mnóstwo informacji o tym, jak to działa.tee
potokistdin
do podanego pliku.:write
napisze dostdin
, a następnie superużytkowniktee
otrzyma zawartość pliku i zapisze plik. Nie utworzy nowego pliku - po prostu nadpisze zawartość - więc tryby plików i atrybuty zostaną zachowane.shellescape()
zmienia znaki specjalne w podanej ścieżce do pliku odpowiednio do bieżącej powłoki. Za pomocą tylko jednego parametru zwykle zawiera ścieżkę w cudzysłowie, jeśli to konieczne. Ponieważ wysyłamy do wiersza poleceń pełnej powłoki, będziemy chcieli przekazać wartość niezerową jako drugi argument, aby umożliwić odwrotne ukośniki innym znakom specjalnym, które w przeciwnym razie mogłyby wyzwolić powłokę.@%
odczytuje zawartość%
rejestru, który zawiera nazwę pliku bieżącego bufora. Nie musi to być ścieżka bezwzględna, więc upewnij się, że nie zmieniłeś bieżącego katalogu. W niektórych rozwiązaniach pominięty zostanie symbol reklamowy. W zależności od lokalizacji%
jest prawidłowym wyrażeniem i ma taki sam efekt jak odczyt%
rejestru. Zagnieżdżony w innym wyrażeniu skrót jest jednak ogólnie niedozwolony: tak jak w tym przypadku.>NUL
i>/dev/null
przekierujstdout
do zerowego urządzenia platformy. Mimo że uciszyliśmy polecenie, nie chcemy, aby cały narzut związany z przesyłaniem potokówstdin
wrócił do vima - najlepiej zrzucić go jak najwcześniej.NUL
jest zerowym urządzeniem w DOS, MS-DOS i Windows, a nie jest prawidłowym plikiem. Od Windows 8 przekierowania do NUL nie powodują zapisania pliku o nazwie NUL. Spróbuj utworzyć plik na pulpicie o nazwie NUL, z rozszerzeniem lub bez: nie będzie można tego zrobić. (Istnieje kilka innych nazw urządzeń w systemie Windows, które warto poznać).~ / .vimrc
Zależny od platformy
Oczywiście nadal nie chcesz ich zapamiętywać i wpisywać za każdym razem. Znacznie łatwiej jest zamapować odpowiednie polecenie na prostsze polecenie użytkownika. Aby to zrobić w systemie POSIX, możesz dodać następujący wiersz do swojego
~/.vimrc
pliku, tworząc go, jeśli jeszcze nie istnieje:Umożliwi to wpisanie polecenia: W (z uwzględnieniem wielkości liter), aby zapisać bieżący plik z uprawnieniami superużytkownika - znacznie łatwiej.
Niezależny od platformy
Korzystam z niezależnego od platformy
~/.vimrc
pliku, który synchronizuje się między komputerami, dlatego do mojego dołączyłem funkcję obsługi wielu platform. Oto~/.vimrc
tylko odpowiednie ustawienia:źródło
sudo
istnieje, ale nie/dev/null
, więc musisz być bardziej wyrafinowany, jeśli chcesz prawdziwej pomocy wieloplatformowej. To raczej wstęp - jedzenie do namysłu. :)Jeśli używasz Vima , dostępny jest skrypt o nazwie sudo.vim . Jeśli okaże się, że otworzyłeś plik, do którego odczytu potrzebujesz dostępu roota, wpisz
Vim zastępuje% nazwą bieżącego pliku isudo:
instruuje skrypt sudo.vim, aby przejął jego odczyt i zapis.źródło
Rada Ryana jest na ogół dobra, jednak jeśli wykonasz krok 3, nie przenoś pliku tymczasowego; będzie miał niewłaściwe prawa własności i uprawnienia. Zamiast
sudoedit
tego poprawny plik i wczytaj zawartość (używając:r
lub podobną) pliku tymczasowego.Jeśli wykonasz krok 2, użyj,
:w!
aby wymusić zapisanie pliku.źródło
Gdy przejdziesz do trybu wstawiania pliku, potrzebujesz edycji sudo, pojawi się komunikat o stanie
Jeśli mi tego brakuje, zazwyczaj tak jest
..następnie..
..lub..
Prawdopodobnie jest to mniej okrężny sposób, ale działa.
źródło
Szybkie Google wydaje się dawać tę radę:
http://ubuntuforums.org/showthread.php?t=782136
źródło
Oto kolejna, która pojawiła się od czasu odpowiedzi na to pytanie, wtyczka o nazwie SudoEdit, która zapewnia funkcje SudoRead i SudoWrite, która domyślnie spróbuje użyć najpierw sudo i su, jeśli to się nie powiedzie: http://www.vim.org/scripts/ script.php? script_id = 2709
źródło
Mam to w moim ~ / .bashrc:
Teraz, gdy muszę edytować plik konfiguracyjny, po prostu otwieram go za pomocą svim.
źródło
sudoedit
Polecenie powinno być korzystne, ponieważ nie wymaga on uruchomiony vim jako root.Szybki hack, który możesz rozważyć, to wykonanie chmod na edytowanym pliku, zapisanie go za pomocą vima, a następnie chmod z powrotem do pierwotnego pliku.
Oczywiście nie polecam tego podejścia w systemie, w którym martwisz się o bezpieczeństwo, ponieważ przez kilka sekund każdy może odczytać / zmienić plik bez Twojej wiedzy.
źródło