Jak zapisać plik, dla którego nie mam uprawnień do zapisu?


26

Czasami zdarza się, że otwieram plik i wprowadzam pewne modyfikacje jako mój użytkownik, nie zauważając ani nie zapominając o zauważeniu [read-only]ostrzeżenia w wierszu stanu (np. Jakiś losowy /etcplik konfiguracyjny, taki jak /etc/resolv.conf).

:w!oczywiście kończy się niepowodzeniem w tym przypadku, ponieważ mój użytkownik i tak nie ma uprawnień do zapisu. Więc muszę :w /home/filenamewyjść i sudo mv ...bardzo niewygodnie.

Czy jest jakiś sposób, żebym tymczasowo eskalował do roota, aby móc zapisać aktualnie otwarty plik? (pod warunkiem, że jestem w sudoers/ i mogę subezpośrednio)?

Odpowiedzi:


24

Sztuką jest użycie połączenia zewnętrznego, aby sudo:

:w !sudo tee %

Jak to działa:

  • :w !<command>wykonuje się <command>z zawartością bufora jako stdin.
  • teeduplikuje standardowe wejście do pliku & standardowe wyjście; %rozwija się do bieżącej nazwy pliku ..
  • Przedrostek ten podajesz sudodla uprawnień roota.

Nie jesteś naprawdę zapisując plik z vim raczej dzwonisz zewnętrznego programu do zastąpienia zawartości pliku, który edytujesz. Oto dlaczego otrzymasz ostrzeżenie od Vima:

W12: Warning: File "xxx" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 

Możesz zmienić to w funkcję:

fun! SuperWrite()
        write !sudo tee %
        " Or with :silent (but that doesn't seem to work for everyone)
        "silent write !sudo tee %
        edit!
endfun

I keybind:

nnoremap <Leader>w! :call SuperWrite()<CR>

Za pomocą sutylko użytkownik root może -cnatychmiast wykonać polecenie. Nie sądzę, że możesz tego użyć su, ale być może istnieje pewien sposób, którego nie znam ...


SuperWritedziała, ale ponownie wyświetla plik w tobie. Uruchomienie go :silentspowoduje, że hasło zostanie wprowadzone niewidocznie.
— TankorSmash

@TankorSmash Thanks; zaktualizowana odpowiedź. Nie jesteś jednak pewien, co masz na myśli przez „niewidoczne wprowadzenie hasła”? silentWydaje się, że dodawanie działa dobrze?
— Martin Tournoij

Nie uruchamiam vima z sudo, więc może tu być gra, ale kiedy idę do sudo tee plik, monituje mnie o hasło sudo. Jeśli jest cichy, nie widzę monitu, ale nadal muszę wprowadzić hasło.
— TankorSmash

1
To, co widzisz, to standardowa funkcja tee wysyłania echa na standardowe wyjście, a także podany plik. Rozwiązaniem jest przekierowanie stdout do / dev / null, la: w ! tee % > /dev/null To nadal będzie odzwierciedlać wynik polecenia (pojedyncza linia), ale nie całą zawartość bufora.
— Jon Carter

Zamiast używania teei wyrzucania danych wyjściowych, nie catdziałałoby również, jeśli nie chcesz wydrukować pliku?
— Lie Ryan,

12

Korzystam z następującego mapowania w moim .vimrc, które uważam za przydatne:

cnoremap w!! w !sudo tee %

Łatwo to zapamiętać, ponieważ wjest to „pisać”, w!jest „wymuszać zapisywanie” i w!!„super-duper-wymusza zapisywanie”. : P


1
Od dawna mam to zmapowane W, ale w!!ma o wiele więcej sensu, zaktualizuję mój .vimrc. Dzięki
— jalanb
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.