Увійшли до vi, внесли зміни, забули спочатку судо - тепер що


10

Я вніс тривалі зміни у файл конфігурації на комп'ютері Ubuntu Linux за допомогою редактора vi. На жаль, спочатку я забув судо, тому зараз я в редакторі, але не можу зберегти свої зміни через відсутні права. Чи можу я заднім числом користуватися судом на цьому терміналі, або який найкращий спосіб вжити?


2
Дивіться також stackoverflow.com/questions/1005/…
звідти

Відповіді:


11

У цьому випадку я пишу файл із :w /tmp/tmpfile. Потім я виходжу і переходжу /tmp/tmpfileдо свого старого файлу з правами sudo.


це те, що я в кінцевому підсумку роблю, але мені подобається відповідь wfaulk .. якщо я можу згадати це лише наступного разу, коли я це роблю! :)
квакш-кіхот

Сподіваюся, ви скопіювали файл, а не переміщували його. Переміщення замінює режим файлу (дозволи) файлу за viзамовчуванням (що, мабуть, 666, а також обернено зворотною позначкою вашого "umask"), замінює власника файлу на ваш UID (це було "root", чи не так?), і розриває жорсткі зв’язки.
Скотт

Кілька питань: (1) Якщо файл повинен бути конфіденційним, а ваш "umask" 22 (а не 66), ця процедура розкриває вміст файлу іншим користувачам, які могли б контролювати /tmpкаталог. (2) Якщо у вас є справді злі користувачі у вашій системі, вони можуть замінити ваші /tmp/tmpfileміж тим, коли ви пишете (з vi), і коли ви копіюєте його в файл конфігурації системи, який ви редагували. Безпечніше помістити тимчасовий файл у каталог, до якого ви маєте доступ.
Скотт

38

Від SO :

:w !sudo tee %

Насправді я зараз користуюся цим способом, щоб зробити це частіше зараз:

:%!sudo tee %

Я думаю, що це трохи інтуїтивніше, оскільки я знаю, що :%!робить, тоді як я не розумію цього :w !. Крім того, легко пропустити дуже важливий простір між wі !.


2
Якщо це допомагає вашій інтуїції, пам’ятайте, що viкоманди можуть бути декількома літерами, тому теоретично може бути wfooкоманда “ ”, тож якщо ви хочете записати у файл, який називається “ foo”, ви повинні сказати “ :w foo”. Тобто вам потрібно пробіл після " :w". Що стосується " :w !" - ви знаєте, що таке " :!", правда? " :!date" Виконує dateкоманду " ". Так " :w !xyz" пише буфер, але не команду, а не файл.
Скотт

На це слід прийняти відповідь, оскільки існуюча відповідь є досить тривалим вирішенням справи, тоді як це негайне рішення. ОП?
bschlueter

-2

Не вдалося відкрити інший термінал і тимчасово змінити права доступу до файлу?


1
Це погана ідея. Напевно, колись не буде великої проблеми із безпекою, але це може бути, і є кращі та простіші рішення (наприклад, запис у тимчасовий файл, а ще краще, :w !sudo tee % solutionрозміщений
wfaulk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.