Вопрос или проблема
Я часто открываю файл в Vim, вношу изменения, и когда дело доходит до сохранения, файл оказывается доступен только для чтения… (принадлежит другому пользователю). Я ищу советы о том, как я мог бы открыть файл с правами root и сохранить изменения, не записывая его предварительно во временный файл для копирования или повторного редактирования с правами root.
Из этого ответа на Stack Overflow от 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 или назначении соответствующих групп файлам, но это не сработало: слишком часто я забывал изменить права собственности или изменял файлы, где не собирался это делать.
Это касается только файлов, которые пока не управляются. Общим решением, которое мы используем, является Puppet с репозиторием git, где люди локально редактируют файлы и тестируют изменения на соответствующих серверах. Если конфигурация работает, как задумано, изменения возвращаются обратно в центральный репозиторий, откуда наш инструмент управления конфигурацией регулярно забирает изменения.
Обычно я, не обязательно самым быстрым, но определенно безопасным способом, делаю что-то подобное (используя nsswitch.conf в качестве примера):
:w! ~/%
Выход из Vim, и затем:
sudo vim nsswitch.conf
1GdG
:r ~/%
Это удалит все строки и прочитает вашу измененную и обновленную версию для редактирования на её месте. Использование домашнего каталога означает, что вам не нужно думать о том, есть ли у вас доступ, и это более приватно, чем /tmp. Обратите внимание, что это замена всего файла: если вы не хотите добавлять все изменения, нужно будет выбирать и настраивать.
Несмотря на сложности, связанные с любым из этих ответов, нет причин терять ваши изменения.
.
Ответ или решение
Работа с файлами, требующими привилегий root, зачастую становится неудобством для администраторов и разработчиков. Сценарий, при котором вы открываете файл в Vim, вносите изменения, а при попытке сохранить их сталкиваетесь с отказом в доступе из-за недостаточных прав, встречается довольно часто. В таких случаях некоторые практики и приёмы могут значительно упростить процесс работы и избежать необходимости сохранения изменений во временный файл.
Теория (Theory)
Когда файл открыт в Vim с правами пользователя, у которого нет прав на запись, возникает вопрос: как эффективно сохранить изменения, не производя дополнительных манипуляций с временными файлами? Ключевая задача здесь заключается в том, чтобы сохранить ваши изменения, минимизировать риск потери данных и избежать повторного открытия файла вручную в новой сессии Vim.
Пример (Example)
Один из популярных способов — использование команды :w !sudo tee %
. Эта команда посылает текущий буфер через команду tee
, которая получает привилегии sudo, перезаписывая тем самым нужный файл с применением root-доступа. Это позволяет сохранить изменения без необходимости создания временного файла; однако, данный подход не позволяет продолжить редактирование файла в текущей сессии Vim.
Если вы хотите перезапустить Vim с правами root и сохранить текущие изменения, можно воспользоваться командой :!sudo vim %
. Эта команда откроет новый процесс Vim, работающий с привилегиями root, позволяя вам редактировать файл прямо на месте.
Применение (Application)
При более глобальном подходе можно воспользоваться:
-
Использование команды
:w !sudo tee %
:- Открыть нужный файл в Vim.
- Внести необходимые изменения.
- Ввести команду
:w !sudo tee %
и ввести пароль для sudo. Это позволяет записать изменения без выхода из режима редактирования, но закрывает текущую сессию.
-
Перезапуск Vim с правами root:
- Использовать команду
:!sudo vim %
, которая открывает новый процесс Vim с правами root. Это полезно, если вы хотите продолжить редактирование после сохранения изменений в файле, но все сделанные изменения могут быть утеряны, если новые изменения не будут внесены в родительский процесс.
- Использовать команду
-
Альтернативные подходы:
- Вы можете сохранить изменения в домашнем каталоге с помощью
:w! ~/имя_файла
, а затем открыть файл с помощьюsudo vim имя_файла
и ввести:r ~/имя_файла
для загрузки изменений в привилегированную сессию. - Использование vimdiff между временной и основной версией файла позволяет детально управлять объединением изменений.
- Вы можете сохранить изменения в домашнем каталоге с помощью
Кроме того, в долгосрочной перспективе стоит рассмотреть возможность использования систем управления конфигурациями, таких как Puppet. Это позволяет автоматизировать управление файлами и поддерживать их в актуальном состоянии через центральное репозиторием, обеспечивая целостность и контроль изменений.
Заключение
Каждый из рассмотренных методов обладает своими преимуществами и ограничениями. Выбор подходящего способа зависит от уникальных требований и уровней доступа в вашей системе. Важно также помнить о потенциальных рисках и обеспечивать резервное копирование важных данных перед внесением значительных изменений. Таким образом, минимизируете вероятность потери информации и можете эффективно адаптировать методики под сценарии использования в вашей сети или системе.