Zalogowałem się do vi, wprowadziłem zmiany, najpierw zapomniałem sudo - teraz co

12

Wprowadziłem długie zmiany w pliku konfiguracyjnym na komputerze z systemem Linux Ubuntu za pomocą edytora vi. Niestety najpierw zapomniałem sudo, więc teraz jestem w edytorze, ale nie mogę zapisać moich zmian z powodu braku uprawnień. Czy mogę wstecznie wykonać sudo użytkownika na tym terminalu lub jaki byłby najlepszy sposób działania?

Szymon
źródło
2
Zobacz także stackoverflow.com/questions/1005/…
stamtąd

Odpowiedzi:

11

W tym przypadku piszę plik za pomocą :w /tmp/tmpfile. Potem wychodzę i przechodzę /tmp/tmpfiledo mojego starego pliku z prawami sudo.

Dom
źródło
to właśnie robię, ale podoba mi się odpowiedź wfaulk .. jeśli mogę to zapamiętać dopiero następnym razem! :)
quack quixote
Mam nadzieję, że skopiujesz plik zamiast go przenieść . Przeniesienie zastępuje tryb pliku (uprawnienia) vidomyślnym (który jest prawdopodobnie 666, AND z odwrotnością twojego „umask”), zastępuje właściciela pliku twoim UID (był to „root”, prawda?), i zrywa twarde linki.
Scott
Kilka problemów: (1) Jeśli plik ma być poufny, a Twój „umask” ma 22 (a nie 66), procedura ta udostępnia zawartość pliku innym użytkownikom, którzy mogą monitorować /tmpkatalog. (2) Jeśli masz naprawdę złych użytkowników w twoim systemie, mogą zastąpić twojego /tmp/tmpfilepomiędzy, kiedy napiszesz (z vi), a kiedy skopiujesz go przez edytowany plik konfiguracji systemu. Bezpieczniej jest umieścić plik tymczasowy w katalogu, do którego tylko Ty masz dostęp.
Scott
40

Od SO :

:w !sudo tee %

Właściwie teraz używam tego sposobu, aby robić to częściej:

:%!sudo tee %

Myślę, że jest to trochę bardziej intuicyjne, ponieważ wiem, co to :%!robi, podczas gdy nie mam głębszego zrozumienia :w !. Ponadto łatwo przeoczyć bardzo ważną przestrzeń między wi !.

wfaulk
źródło
3
Jeśli to pomaga twojej intuicji, pamiętaj, że vipolecenia mogą składać się z wielu liter, więc teoretycznie może istnieć wfoopolecenie „ ”, więc jeśli chcesz napisać do pliku o nazwie „ foo”, musisz powiedzieć „ :w foo”. Tzn. Potrzebujesz spacji po „ :w”. Jeśli chodzi o „ :w !” - wiesz, co to jest „ :!”, prawda? „ :!date” Uruchamia datepolecenie „ ”. Więc „ :w !xyz” zapisuje bufor, ale raczej do polecenia niż do pliku.
Scott
Należy przyjąć tę odpowiedź, ponieważ obecna istniejąca odpowiedź jest dość długa, ale jest to natychmiastowe rozwiązanie. OP?
bschlueter
@Scott dzięki za wyjaśnienie! Co to jest tee i %chociaż?
CodyBugstein
@CodyBugstein: Witam. (1) Pingowanie autorów komentarzy sześcioletnich często nie prowadzi do niczego, ponieważ ludzie czasami wychodzą i nigdy nie wracają. Ale jestem przykuty do mojego komputera; Prawdopodobnie będę tu na zawsze. (A może nie.) (2) Czy próbowałeś robić badania? Informacje o „tee” powinny być łatwe. ( % może być trudniej.) (3) OK, pomogę ci trochę.  teeto program, który pozwala zapisywać informacje w wielu miejscach. Na przykład date | tee codyzapisze bieżącą datę i godzinę w pliku o nazwie cody … ( ciąg dalszy)
Scott
(Ciąg dalszy)… a także do ekranu terminala.  date | tee cody > bugsteinzapisze bieżącą datę i godzinę do pliku o nazwie, codya także do pliku o nazwie bugstein. - Rozumiesz sudo? Pozwala uruchomić komendę z uprawnieniami innego użytkownika (zazwyczaj root). Na przykład ls /rootogólnie się nie powiedzie, ponieważ nie masz dostępu do  /root. Ale sudo ls /rootzadziała. - Niefortunnym efektem ubocznym sposobu działania Uniksa jest to, że sudo ls /root > /root/codyzawiedzie, ponieważ nie masz dostępu do  /root, a więc nie możesz pisać /root/cody. … (Ciąg dalszy)
Scott
-2

Nie możesz otworzyć innego terminala i tymczasowo zmienić prawa dostępu do pliku?

Terje Mikal
źródło
1
To jest zły pomysł. Prawdopodobnie nigdy nie będzie to poważny problem z bezpieczeństwem, ale może być, i istnieją lepsze i prostsze rozwiązania (takie jak zapis do pliku tymczasowego lub lepiej, :w !sudo tee % solutionwysłany przez wfaulk
dbr 10.10.2009