Uzyskanie uprawnień roota na pliku wewnątrz vi?

głosy
227

Często podczas edycji plików konfiguracyjnych, będę otworzyć jeden z vi, a następnie, kiedy idę zapisać go sobie sprawę, że nie wpisać

sudo vi filename

Czy istnieje jakiś sposób, aby dać przywileje sudo vi zapisać plik? Wydaje mi się przypomnieć, widząc coś o tym, patrząc w górę kilka rzeczy o VI jakiś czas temu, ale teraz nie mogę go znaleźć.

Utwórz 04/08/2008 o 04:34
źródło użytkownik
W innych językach...                            


11 odpowiedzi

głosy
276

% otrzymuje z aktualną nazwą pliku, więc można użyć:

:w !sudo tee %

( vimWykryje, że plik został zmieniony i zapyta, czy chcesz to być przeładowane.)

Jako skrót można definiować własne polecenia. Umieścić następujące w twojej .vimrc:

command W w !sudo tee % >/dev/null

Z powyższego można wpisać :W<Enter>, aby zapisać plik. Ponieważ to pisałem, znalazłem ładniejszy sposób (moim zdaniem), aby to zrobić:

cmap w!! w !sudo tee >/dev/null %

W ten sposób można wpisać :w!!i będzie rozszerzony do pełnej linii poleceń, pozostawiając kursor na końcu, więc można wymienić %z nazwy pliku z własną rękę, jeśli chcesz.

Odpowiedział 31/08/2008 o 20:23
źródło użytkownik

głosy
29

Ogólnie rzecz biorąc, nie można zmienić efektywny identyfikator użytkownika procesu vi, ale można to zrobić:

:w !sudo tee myfile
Odpowiedział 04/08/2008 o 07:52
źródło użytkownik

głosy
13

wspólne Ostrzeżenia

Najczęstszym sposobem poruszania problemu plików tylko do odczytu jest otwarcie rury do pliku bieżącego jako super-użytkownika przy użyciu implementację sudo tee. Jednak wszystkie z najbardziej popularnych rozwiązań, które znalazłem w całym internecie mają połączenie kilku potencjalnych zastrzeżeniami:

  • Cały plik zostanie zapisany do terminala, a także w pliku. To może być powolne dla dużych plików, szczególnie w przypadku wolnych połączeń sieciowych.
  • Plik traci swoje tryby i podobnych atrybutów.
  • Ścieżki plików z nietypowych znaków lub przestrzeni może nie być prawidłowo obsługiwane.

Rozwiązania

Aby obejść wszystkie te problemy, można użyć następującego polecenia:

" On POSIX (Linux/Mac/BSD):
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'

Te mogą być skrócone, z szacunkiem:

:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'

Wyjaśnienie

:zaczyna polecenie; trzeba będzie wpisać ten znak w trybie normalnym, aby rozpocząć wprowadzanie poleceń. Powinien on zostać pominięty w skryptach.

sil[ent]hamuje wyjście z polecenia. W tym przypadku chcemy, aby zatrzymać Press any key to continue-Jak Komunikat wyświetlany po uruchomieniu :!polecenia.

exec[ute]wykonuje ciąg jako polecenia. Nie możemy po prostu uruchomić :write, ponieważ nie będzie przetwarzać niezbędną wywołanie funkcji.

!przedstawia :!polecenia: tylko polecenie :writeprzyjmuje. Zwykle :writeprzyjmuje ścieżkę do pliku, do którego chcesz napisać. :!na własnych prowadzi polecenie powłoki (na przykład za pomocą bash -c). Dzięki :write, to uruchomić polecenie w powłoce, a następnie napisać cały plik stdin.

sudopowinno być oczywiste, ponieważ to dlaczego tu jesteś. Uruchom komendę jako super-użytkownika. Jest mnóstwo informacji wokół „netto o tym, jak to działa.

teeRury stdindo danego pliku. :writezapisze stdin, to super-użytkownik teeotrzyma zawartość pliku i zapisz plik. To nie stworzy nowy plik - wystarczy nadpisać zawartość - tak tryby plików i atrybuty zostaną zachowane.

shellescape()ucieka znaki specjalne w danej ścieżce pliku odpowiednio do bieżącej powłoki. Z tylko jednego parametru, byłoby zazwyczaj tylko ująć ścieżkę w cudzysłowach, jak to konieczne. Ponieważ jesteśmy wysyłanie do pełnej linii poleceń powłoki, to chcemy przekazać wartość niezerową jako drugi argument do umożliwienia backslash-cytowanie innych znaków specjalnych, które w przeciwnym razie mogłyby utrącają powłokę.

@%odczytuje zawartość %rejestru, który zawiera nazwę pliku bieżącego bufora. To niekoniecznie ścieżka bezwzględna, więc upewnij się, że nie zmieniły się w bieżącym katalogu. W niektórych rozwiązaniach, widać symbol handlowy-at pominięte. W zależności od lokalizacji, %jest prawidłowy wyraz, i ma taki sam efekt jak czytanie %rejestru. Zagnieżdżona w innej wypowiedzi skrót jest generalnie niedozwolonych jednak: takie jak w tym przypadku.

>NULi >/dev/nullprzekierować stdoutdo pustego urządzenia platformy. Nawet jeśli mamy wyciszony polecenia, nie chcemy wszystkich narzutu związanego z potokiem stdinz powrotem do vim - najlepiej zrzucić go tak wcześnie, jak to możliwe. NULUrządzenie jest zerowy na DOS, MS-DOS i Windows, nie jest poprawnym plikiem. Począwszy od Windows 8 przekierowania do NUL nie powodują plik o nazwie NUL jest napisane. Spróbuj utworzyć plik na pulpicie o nazwie NUL, z lub bez rozszerzenia pliku: będziesz w stanie to zrobić. (Istnieje kilka innych nazw urządzeń w systemie Windows, które mogą być warte poznania).

~ / .vimrc

Zależne od platformy

Oczywiście, nadal nie chce zapamiętać te i wpisać je za każdym razem. Jest to znacznie łatwiejsze do map odpowiednią komendę do prostszej polecenia użytkownika. Aby to zrobić na POSIX, można dodać następującą linię do ~/.vimrcpliku, tworząc go, jeśli jeszcze nie istnieje:

command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

Pozwoli to, aby wpisać: w (wielkość liter ma znaczenie) polecenie, aby zapisać bieżący plik z uprawnieniami superużytkownika - znacznie łatwiejsze.

Niezależny od platformy

Używam niezależny od platformy ~/.vimrcplik, który synchronizuje się na różnych komputerach, więc dodałem funkcjonalność multi-platform do kopalni. Oto ~/.vimrctylko z odpowiednimi ustawieniami:

#!vim
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
"   ts:     Actual tab character stops.
"   sw:     Indentation commands shift by this much.
"   sr:     Round existing indentation when using shift commands.
"   sts:    Virtual tab stops while using tab key.
"   fdm:    Folds are manually defined in file syntax.
"   ff:     Line endings should always be <NL> (line feed #09).
"   fenc:   Should always be UTF-8; #! must be first bytes, so no BOM.


" General Commands: User Ex commands. {{{1
    command W call WriteAsSuperUser(@%)         " Write file as super-user.


" Helper Functions: Used by user Ex commands. {{{1
    function GetNullDevice() " Gets the path to the null device. {{{2
        if filewritable('/dev/null')
            return '/dev/null'
        else
            return 'NUL'
        endif
    endfunction

    function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
        exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
    endfunction


" }}}1
" EOF
Odpowiedział 13/10/2012 o 07:54
źródło użytkownik

głosy
10

Jeśli używasz Vima , jest dostępny skrypt o nazwie sudo.vim . Jeśli okaże się, że masz otwarty plik, potrzebujesz dostępu do konta roota, aby przeczytać, typ

: E sudo:%
Vim zastępuje% z nazwą bieżącego pliku i sudo:instruuje sudo.vim skrypt przejąć do czytania i pisania.

Odpowiedział 24/09/2008 o 05:12
źródło użytkownik

głosy
7

Rada Ryana jest na ogół dobre, jednak jeśli po kroku 3 nie przenieść plik tymczasowy; będzie to mieć zły własności i uprawnień. Zamiast sudoeditpoprawny plik i odczytywać zawartość (używając :rlub podobne) w pliku tymczasowym.

Jeżeli po kroku 2, należy :w!wymusić plik do zapisu.

Odpowiedział 04/08/2008 o 05:04
źródło użytkownik

głosy
3

Gdy idziesz w tryb wprowadzania na pliku potrzebny jest dostęp sudo do edycji, pojawi się komunikat o stanie powiedzieć

-- INSERT IGNORE  -- W10: Warning: Changing a readonly file

Jeśli tęsknię, że generalnie robię

:w ~/edited_blah.tmp
:q

..następnie..

sudo "cat edited_blah.tmp > /etc/blah"

..lub..

sudo mv edited_blah.tmp /etc/blah

Jest to prawdopodobnie mniej rondo sposób to zrobić, ale to działa.

Odpowiedział 12/08/2008 o 19:37
źródło użytkownik

głosy
1

Oto kolejny, który pojawił się, ponieważ kwestia ta została wysłuchana, plugin o nazwie SudoEdit który zapewnia funkcje SudoRead i SudoWrite, który będzie domyślnie spróbuje użyć sudo su pierwszy i jeśli to się nie uda: http://www.vim.org/scripts/ script.php? SCRIPT_ID = 2709

Odpowiedział 29/01/2010 o 18:21
źródło użytkownik

głosy
1

Szybkie Google wydaje się dać tej rady:

  1. Nie staraj się zmieniać, jeśli jest tylko do odczytu.
  2. Możesz być w stanie zmienić uprawnienia do pliku. (To, czy będzie to pozwala zapisać się do eksperymentów).
  3. Jeśli nadal edytowany tak, zapisać do pliku tymczasowego, a następnie przenieść go.

http://ubuntuforums.org/showthread.php?t=782136

Odpowiedział 04/08/2008 o 04:39
źródło użytkownik

głosy
0

Mam to w moim ~ / .bashrc:

alias svim='sudo vim'

Teraz ilekroć trzeba edytować plik konfiguracyjny po prostu otworzyć go z svim.

Odpowiedział 19/03/2009 o 13:51
źródło użytkownik

głosy
-2

Szybkie hack, można rozważyć robi chmod na pliku, który edytujesz, zapisz z vim, a następnie z powrotem do chmod co plik był pierwotnie.

ls -l test.file (to see the permissions of the file)
chmod 777 test.file
[This is where you save in vim]
chmod xxx test.file (restore the permissions you found in the first step)

Oczywiście nie polecam tego podejścia w systemie, w którym martwisz się o bezpieczeństwo, jak przez kilka sekund każdy może czytać / zmienić plik bez ciebie realizacji.

Odpowiedział 05/08/2008 o 23:20
źródło użytkownik

głosy
-7

używać gksudo zamiast sudo dla GVim tj

cmap w!! w !gksudo tee >/dev/null %
Odpowiedział 30/11/2010 o 07:33
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more