Я часто открываю файл в vim, вношу некоторые изменения и, когда пришло время сохранить, файл доступен только для чтения .. (принадлежит другому пользователю). Я ищу советы о том, как повторно открыть файл как root и сохранить свои изменения без предварительного сохранения его во временный файл для копирования или повторного редактирования как root.
Из этого ответ stackoverflow, по скинп
:w !sudo tee %
Я часто забываю sudo перед редактированием файла, для которого у меня нет прав на запись. Когда я прихожу, чтобы сохранить этот файл и получаю ошибку разрешения, я просто запускаю эту команду vim, чтобы сохранить файл без необходимости сохранять его во временный файл, а затем снова копировать его.
Пожалуйста, не голосуйте за меня. Я не рекомендую реализовывать этот ответ, но это ответ, который просит 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), я никогда об этом не думал.
Обычно я сохраняю его во временный файл в $ 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. Обратите внимание, что это полная замена файла: если вы не хотите добавлять все изменения, вам придется выбирать.
Несмотря на головную боль, связанную с любым из этих ответов, нет причин терять свои изменения.