Вопрос или проблема
На моей машине с Red Hat, когда я выполняю команду echo $HOME
под своей обычной учетной записью, я получаю /home/snrub
. Когда я запускаю команду sudo vim foo.txt
и внутри vim ввожу echo $HOME
, мне возвращается /root
. Я хочу, чтобы вместо этого возвращалось /home/snrub
, чтобы могли работать мои классные плагины Vim, даже когда я редактирую файл с помощью sudo. Согласно странице man для sudo, параметры -E
или -H
должны работать, но если я запускаю sudo -E vim foo.txt
или sudo -H vim foo.txt
или sudo -EH vim foo.txt
, они все равно не читают мой домашний файл .vimrc и возвращают /root
, когда я ввожу echo $HOME
.
Я также пытался добавить следующую строку в файл sudoers и сохранить:
Defaults env_keep += "HOME"
Все равно не работает. Если я запускаю sudo vim foo.txt
, а затем внутри Vim ввожу echo $HOME
, он все еще говорит /root
. Аналогично (и чтобы проверить, что это не связано строго с Vim), если я введу sudo emacs foo.txt
и нажму Enter, затем введу Alt-X, введу getenv
и нажму Enter, затем введу HOME
и нажму Enter, он все равно вернет /root
. Как мне сделать так, чтобы он возвращал /home/snrub
?
В целях безопасности sudo
сбрасывает список переменных окружения (TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME и SUDO_*), когда включена опция env_reset
, которая включена по умолчанию. Чтобы переменная HOME перенеслась из вашей учетной записи пользователя в окружение sudo
, вам нужно либо:
-
использовать тег SETENV в правиле sudo вместе с опцией
-E
, или -
специально отключить опцию
env_reset
.
Кроме того, убедитесь, что always_set_home
выключен (что по умолчанию и так).
Смотрите страницу man для sudoers для всех деталей и взаимодействий.
Ответ или решение
Существует несколько причин, почему переменная окружения $HOME
не сохраняется при использовании команды sudo
, даже когда вы пробуете использовать опции -E
и -H
.
По умолчанию sudo
сбрасывает ряд переменных окружения (включая HOME
) как часть механизма безопасности, чтобы предотвратить потенциальные уязвимости. Этот механизм включен по умолчанию через опцию env_reset
в конфигурации sudo
. Чтобы $HOME
сохранялся при выполнении команд через sudo
, нужно выполнить одно из следующих действий:
-
Использовать тег SETENV в правиле sudo: Вы можете настроить файл sudoers таким образом, чтобы переменная окружения
HOME
сохранялась. Для этого добавьте следующую строку в ваш файл/etc/sudoers
(редактируйте файл с помощью командыvisudo
для предотвращения ошибок синтаксиса):Defaults env_keep += "HOME"
Убедитесь, что эта строка корректно добавлена. Если вы уже сделали это, но изменения не в действии, существует вероятность проблемы с более строгими политиками вашей системы.
-
Отключить опцию env_reset: Это более рискованное решение, так как это может сделать систему уязвимой. Для этого добавьте в файл sudoers:
Defaults !env_reset
Однако, это не рекомендуется, так как это может привести к небезопасным ситуациям.
-
Проверьте опцию always_set_home: Убедитесь, что она отключена, если она установлена. Эта опция отвечает за то, что при использовании
sudo
устанавливается$HOME
как/root
. Вы можете проверить и изменить это следующим образом:Defaults !always_set_home
-
Проверка текущих настроек: Чтобы убедиться в том, какие именно настройки действуют в вашей системе, вы можете использовать команду
sudo -l
для просмотра всех доступных для вашей учетной записи командsudo
и связанных с ними настроек. -
Локально настроить окружение в Vim: Если ваше намерение только в том, чтобы использовать плагины Vim, вы можете вручную установить переменные окружения внутри файла конфигурации Vim (
.vimrc
). Например:let $HOME='/home/snrub'
Также полезно помнить, что при использовании различных редакторов (таких как Vim или Emacs) через sudo
, они могут иметь специфичные параметры, которые также могут влиять на поведение.
Если даже после выполнения этих шагов проблема сохраняется, проверьте, не влияет ли на это конфигурация вашего рабочего окружения или дополнительные параметры безопасности на уровне системы.