vim заново отредактируйте как root
Я часто открываю файл в vim, делаю некоторые изменения, и когда приходит время сохранять файл, доступен только для чтения.. (принадлежит другому пользователю). Я ищу советы о том, как я могу заново открыть файл как root и сохранить свои изменения без предварительного сохранения его во временный файл для копирования или повторного редактирования как root.
4 ответа
От этого ответа stackoverflow, по skinp
:w !sudo tee %
Я часто забываю sudo перед редактированием файла, на который у меня нет разрешения на запись. Когда я прихожу, чтобы сохранить этот файл и получить ошибку разрешения, я просто запускаю эту команду vim, чтобы сохранить файл без необходимости сохранять его во временном файле, а затем снова скопировать его.
Пожалуйста, не голосуйте за меня. Я не рекомендую реализовывать этот ответ, но это ответ, который просит 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), я никогда не думал об этом.
Обычно я сохраняю его во временный файл в $HOME/tmp/apache.conf (например)
sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf
это дополнительная работа по объединению изменений, но она окупилась. Я считаю, что это хороший путь между удобством и измерениями против нежелательных изменений
До этого я думал о ACL-списках или назначении соответствующих групп файлам, но это не всегда удавалось, я часто забывал сменить владельца или менял файлы там, где я не хотел этого делать.
Это относится только к файлам, которые не управляются до сих пор. Общее решение, которое мы используем, - это марионетка с git-репо, где люди локально редактируют файлы и тестируют изменения на соответствующих серверах, если конфигурация работает так, как нужно, изменения передаются обратно в центральный репозиторий, где наш механизм конфигурации вытягивает изменения с регулярными интервалами.
Что я обычно делаю - не обязательно самый быстрый, но наверняка безопасный - это делать что-то вроде этого (используя в качестве примера nsswitch.conf):
:w! ~/%
Выйдите из vim, затем выполните:
sudo vim nsswitch.conf
1GdG
:r ~/%
Это удалит все строки и прочитает в вашей измененной и обновленной версии для редактирования на своем месте. Использование вашего домашнего каталога означает, что вам не нужно думать о том, есть ли у вас доступ или нет - он более приватный, чем / tmp. Обратите внимание, что это полная замена файла: если вы не хотите добавлять все изменения, вам придется выбирать и выбирать.
Несмотря на головную боль, связанную с любым из этих ответов, нет причин терять ваши изменения.