Вы вошли в vi, внесли изменения, сначала забыли sudo - что теперь

10

Я сделал длительные изменения в файле конфигурации на компьютере с Ubuntu Linux с помощью редактора vi. К сожалению, я сначала забыл sudo, так что теперь я в редакторе, но не могу сохранить свои изменения из-за отсутствия прав. Могу ли я задним числом судить пользователя на этом терминале, или как лучше всего действовать?

Саймон
источник
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

От ТАК :

:w !sudo tee %

На самом деле, я теперь использую этот способ делать это чаще:

:%!sudo tee %

Я думаю, что это немного более интуитивно, поскольку я знаю, что :%!делает, тогда как у меня нет интуитивного понимания :w !. Кроме того, легко пропустить очень важное пространство между wи !.

wfaulk
источник
2
Если это поможет вашей интуиции, помните, что viкоманды могут состоять из нескольких букв, поэтому теоретически может быть wfooкоманда « », поэтому, если вы хотите записать в файл с именем « foo», вы должны сказать « :w foo». То есть вам нужно пробел после « :w». Что касается « :w !» - вы знаете, что такое « :!», верно? « :!date» Запускает dateкоманду « ». Таким образом, « :w !xyz» записывает буфер, но в команду, а не в файл.
Скотт
Это должно быть принято как принятый ответ, так как текущий существующий ответ является довольно длительным обходным путем, тогда как это является немедленным решением. OP?
bschlueter
-2

Не могли бы вы открыть другой терминал и временно изменить права доступа к файлу?

Терье Микал
источник
1
Это плохая идея. Возможно , привычка никогда не будет большой проблемой безопасности, но это может быть, и лучше , и более простые решения (например , для записи во временный файл, или лучше, :w !sudo tee % solutionwfaulk отвечал
DBR