Стать root изнутри Vim

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

Иногда я начинаю редактировать файлы конфигурации в /etc с помощью Vim, но забываю использовать sudo, чтобы запустить Vim. Неизбежный результат в том, что после завершения редактирования я сталкиваюсь с неприятным уведомлением о том, что у меня нет прав для сохранения файла.

Чаще всего изменения настолько малы, что я просто выхожу из Vim и проделываю все заново как root. Конечно, я мог бы сохранить в место, где имею права на запись, а затем скопировать как root, но это тоже немного раздражает.

Но я уверен, что есть более простой способ стать root или использовать sudo изнутри Vim, не отказываясь от изменений. Если метод не будет зависеть от настроек sudo для пользователя, это будет даже лучше.

sudo не может изменить эффективного пользователя существующего процесса, он всегда создает новый процесс с повышенными привилегиями, и оригинальный shell остается неизменным. Это фундаментальная особенность дизайна UNIX. Я чаще всего просто сохраняю файл в /tmp как временное решение. Если вы действительно хотите сохранить его напрямую, вы можете попробовать использовать функцию Vim, где он может отправить файл в другой процесс. Попробуйте сохранить с этой командой:

:w !sudo dd of="%"

Проверено и работает. Vim затем попросит вас перезагрузить файл, но это не обязательно: вы можете просто нажать o, чтобы избежать перезагрузки и потери истории отмен. Вы даже можете сохранить это как команду/функцию Vim или привязать к клавише для легкого доступа, но я оставлю это как упражнение для читателя.

Сохранение файла как root:

:w !sudo tee %

Используйте sudoedit для редактирования файлов как root.

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

Вы можете поместить это в ваш .vimrc

cmap w!! %!sudo tee > /dev/null %

Вы вызываете его, набрав :w!! – он передаст файл через sudo tee в текущее имя файла (%).

Из теперь удаленного поста на https://stackoverflow.com/questions/95072/what-are-your-favorite-vim-tricks; также смотрите: https://stackoverflow.com/questions/1218390/what-is-your-most-productive-shortcut-with-vim

Это тоже работает хорошо:

:w !sudo sh -c "cat > %"

Это вдохновлено комментарием @Nathan Long в этом ответе.

ПРЕДУПРЕЖДЕНИЕ:

" должен быть использован вместо ', потому что мы хотим, чтобы % был развернут перед передачей в оболочку.

Ответ или решение

Вопрос о том, как стать root изнутри Vim, когда забываешь запустить его с правами суперпользователя, является распространенной проблемой среди администраторов и продвинутых пользователей Linux. В подобных ситуациях, когда пользователь открывает конфигурационные файлы в каталоге /etc и начинает их редактирование без использования sudo, возникает ошибка при попытке сохранения изменений, связанная с отсутствием прав на запись.

Теория

При работе с Linux система сохранения прав доступа играет ключевую роль в обеспечении безопасности. По умолчанию, процессы, запущенные пользователями, имеют доступ к тем ресурсам, которые определены для конкретного пользователя. Когда вы запускаете Vim без sudo, процесс работает с правами текущего пользователя и не может модифицировать файлы, защищенные системными правами.

В Unix-подобных системах такое ограничение обусловлено тем, что sudo не может изменить эффективного пользователя для уже существующего процесса; вместо этого оно создает новый процесс с повышенными привилегиями. Поэтому обычное решение заключается либо в пересохранении файла во временное хранилище, либо в перезапуске Vim с правами суперпользователя.

Пример

Существует несколько способов, как обойти это ограничение, не покидая Vim и не теряя внесенные изменения. Ниже приведены несколько решений, использующих возможности Vim и системы Unix:

  1. Использование команды dd через sudo:

    :w !sudo dd of="%"

    Эта команда позволяет записать содержимое файла посредством dd, выполняемого с привилегиями sudo. Система запросит у вас пароль суперпользователя, но при этом, Vim сохранит текст в нужное место.

  2. Использование команды tee через sudo:

    :w !sudo tee %

    Здесь файл записывается с помощью tee, который перенаправляет стандартный ввод в файл. Это решение также оставляет у вас возможность отмены изменений с помощью функций Vim.

  3. Редактирование конфигурации VimRC:

    Вы можете добавить следующее в ваш файл .vimrc:

    cmap w!! %!sudo tee > /dev/null %

    После этого, в случае ошибки прав, вы можете просто использовать команду :w!!, чтобы сохранить файл с необходимыми правами.

  4. Вызов редактирования через shell:

    :w !sudo sh -c "cat > %"

    Здесь используется sh -c, для вызова shell и записи содержимого в защищенный файл.

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

Применение

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

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

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

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

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