vim отредактируйте как root

28

Я часто открываю файл в vim, делаю некоторые изменения, и когда приходит время сохранять файл, доступен только для чтения .. (принадлежит другому пользователю). Я ищу советы о том, как я могу заново открыть файл как root и сохранить свои изменения без предварительного сохранения его во временный файл для копирования или повторного редактирования как root.

rkthkr
источник

Ответы:

42

От этого ответа stackoverflow , по skinp

:w !sudo tee %

Я часто забываю sudo перед редактированием файла, на который у меня нет разрешения на запись. Когда я прихожу, чтобы сохранить этот файл и получить ошибку разрешения, я просто запускаю эту команду vim, чтобы сохранить файл без необходимости сохранять его во временном файле, а затем снова скопировать его.

DBR
источник
Это почти все .. Но было бы неплохо, чтобы vim перезапустился и запустился с правами root. Это мой любимый до сих пор :)
rkthkr
@rkthkr, если «vim перезапустится и запустится с правами root», вы не сможете сохранить внесенные вами изменения и потерять историю отмен. Но если это то, что вы хотите ... [Закончились символы.] Смотрите "ответ", который я собираюсь написать.
Бруно Броноски
2
@dbr, я думаю, стоит упомянуть, что после перезаписи файла (с tee как sudo) вам будет предложено ввести [O] k или [L] oad. Более поздняя опция удалит вашу историю отмен и сбросит «измененный флаг», позволяющий вам выйти без предупреждения о сохранении изменений. Первый вариант, который я предпочитаю, сохранит вашу историю отмен, но заставит вас получить предупреждение при попытке выйти. Вы должны использовать: q! выйти в этом случае. Я делаю это, чтобы я мог проверить (например:! Sudo /etc/init.d/httpd configtest) и выполнить откат / повтор, если мне нужно.
Бруно Броноски
15

Пожалуйста, не голосуйте за меня. Я не рекомендую реализовывать этот ответ, но это ответ, который просит rkthkr.

rkthkr сказал:
но было бы хорошо, чтобы vim перезапустился и запустился с правами root

Способ сделать это с помощью :!sudo vim %
ipozgaj:% в качестве аргумента (даже субаргумента) заменяется путем к текущему буферу. (Вам может быть предложено ввести пароль.) В результате вы получите новый процесс vim, принадлежащий root, который является дочерним процессом исходного процесса vim. Звучит глупо, верно? Вот как это выглядит в PS:

~# ps afo pid,ppid,user,stat,comm
  PID  PPID USER         STAT COMMAND
16187 30478 rbronosky    Ss   bash
16510 16187 rbronosky    R+    \_ ps
30482 30478 rbronosky    Ss   bash
16244 30482 rbronosky    S+    \_ vim
16318 16244 root         S+        \_ vim

Если у вас есть права на запись в каталог, содержащий файл, и вы внесли изменения в него, вы можете получить предупреждение о выходе файла подкачки. Выбор [R] ecover отражает большинство * изменений, внесенных родительским процессом vim. (* Я думаю, что, возможно, обновление свопа рассчитано по времени или имеет дельта-порог. Я уже слишком много времени уделяю этому и не хочу исследовать его.) Когда вы выходите и выходите из vim, не пугайтесь, когда вы все еще в vim ... вы открыли второй процесс vim. Помнить?

Теперь, со всем этим сказано ... Я бы почти никогда не делал этого. Возможно, если у меня было недостаточно или слишком много кофе, и я понял, что мне нужно будет отредактировать еще несколько файлов от имени root ... Я мог бы попробовать это. За 14 лет администрирования систем у меня никогда не было. Но, пока вы не выразили недовольство по поводу моего предпочтительного решения (которое точно соответствует предложению dbr), я никогда не думал об этом.

Бруно Броноски
источник
Спасибо, Ричард! Очень информативно, я дам тебе +1 за это :)
rkthkr
Это очень качественный ответ: зачем голосовать? +1 от меня тоже.
Мэй
1
Спасибо @Richard Bronosky, в моем gvim невозможно ввести пароль sudo, :w !sudo tee %поэтому я думаю, что это хороший ответ.
Эрик Фортис
1

Обычно я сохраняю его во временный файл в $ HOME / tmp / apache.conf (например)

sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf

это дополнительная работа по объединению изменений, но она окупилась. Я считаю, что это хороший путь между удобством и измерениями против нежелательных изменений

До этого я думал о ACL-списках или назначении соответствующих групп файлам, но это не всегда удавалось, я часто забывал сменить владельца или менял файлы там, где я не хотел этого делать.

Это относится только к файлам, которые не управляются до сих пор. Общее решение, которое мы используем, - это марионетка с git-репо, где люди локально редактируют файлы и тестируют изменения на соответствующих серверах, если конфигурация работает так, как нужно, изменения передаются обратно в центральный репозиторий, где наш механизм конфигурации извлекает изменения с регулярными интервалами.

serverhorror
источник
0

Что я обычно делаю - не обязательно самый быстрый, но наверняка безопасный - это делать что-то вроде этого (используя в качестве примера nsswitch.conf):

:w! ~/%

Выйдите из vim, затем выполните:

sudo vim nsswitch.conf
1GdG
:r ~/%

Это удалит все строки и прочитает в вашей измененной и обновленной версии для редактирования на своем месте. Использование вашего домашнего каталога означает, что вам не нужно думать о том, есть ли у вас доступ или нет, и он более приватный, чем / tmp. Обратите внимание, что это полная замена файла: если вы не хотите добавлять все изменения, вам придется выбирать и выбирать.

Несмотря на головную боль, связанную с любым из этих ответов, нет причин терять ваши изменения.

Mei
источник