Запустите повторное редактирование в Vim от имени root.

Вопрос или проблема

Я часто открываю файл в 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)

При более глобальном подходе можно воспользоваться:

  1. Использование команды :w !sudo tee %:

    • Открыть нужный файл в Vim.
    • Внести необходимые изменения.
    • Ввести команду :w !sudo tee % и ввести пароль для sudo. Это позволяет записать изменения без выхода из режима редактирования, но закрывает текущую сессию.
  2. Перезапуск Vim с правами root:

    • Использовать команду :!sudo vim %, которая открывает новый процесс Vim с правами root. Это полезно, если вы хотите продолжить редактирование после сохранения изменений в файле, но все сделанные изменения могут быть утеряны, если новые изменения не будут внесены в родительский процесс.
  3. Альтернативные подходы:

    • Вы можете сохранить изменения в домашнем каталоге с помощью :w! ~/имя_файла, а затем открыть файл с помощью sudo vim имя_файла и ввести :r ~/имя_файла для загрузки изменений в привилегированную сессию.
    • Использование vimdiff между временной и основной версией файла позволяет детально управлять объединением изменений.

Кроме того, в долгосрочной перспективе стоит рассмотреть возможность использования систем управления конфигурациями, таких как Puppet. Это позволяет автоматизировать управление файлами и поддерживать их в актуальном состоянии через центральное репозиторием, обеспечивая целостность и контроль изменений.

Заключение

Каждый из рассмотренных методов обладает своими преимуществами и ограничениями. Выбор подходящего способа зависит от уникальных требований и уровней доступа в вашей системе. Важно также помнить о потенциальных рисках и обеспечивать резервное копирование важных данных перед внесением значительных изменений. Таким образом, минимизируете вероятность потери информации и можете эффективно адаптировать методики под сценарии использования в вашей сети или системе.

Оцените материал
Добавить комментарий

Капча загружается...