Вопрос или проблема
У меня есть переменная, установленная в скрипте в /etc/profile.d/somescript.sh.
Я изменил /etc/sudoers и добавил пользователя “ansible” в файл sudoers следующим образом:
Defaults !env_reset
ansible ALL=(ALL) NOPASSWD: ALL
Почему первая строка ничего не выводит? Почему “sudo env” не показывает все переменные окружения (только частично)?
[ansible@ACEPP-LM-01 ~]$ sudo env | grep ENV
[ansible@ACEPP-LM-01 ~]$ sudo echo $ENV
PP
[ansible@ACEPP-LM-01 ~]$ echo $ENV
PP
[ansible@ACEPP-LM-01 ~]$ env | grep ENV
ENV=PP
Решение для того, что мне нужно, — это добавить
alias sudo=”sudo -i”
в ~/.bashrc для пользователя root и также для пользователя ansible.
Попробуйте использовать параметр -E
с sudo
:
-E, --preserve-env
Указывает политике безопасности, что пользователь хочет
сохранить свои существующие переменные окружения. Политика
безопасности может вернуть ошибку, если у пользователя нет
разрешения на сохранение окружения.
Ответ или решение
Почему sudo env
не отображает все переменные окружения
При выполнении команды sudo env
вы заметили, что не все переменные окружения, установленные в вашем скрипте /etc/profile.d/somescript.sh
, отображаются. Давайте разберемся в причинах этого поведения.
1. Параметр env_reset
По умолчанию в системе используется параметр env_reset
, который сбрасывает переменные окружения при использовании sudo
. Это сделано в целях безопасности, чтобы избежать передачи ненадежных переменных окружения, которые могут содержать конфиденциальную информацию или повлиять на поведение выполняемых команд.
В вашем случае вы изменили файл sudoers
, добавив строку Defaults !env_reset
, чтобы отключить сброс окружения. Однако необходимо учитывать, что даже с этой настройкой, функция sudo
по умолчанию не сохраняет все переменные окружения, а только те, которые явно разрешены в конфигурации.
2. Переменная ENV
Вы упомянули переменную ENV
, которая установлена и видима в вашем пользовательском окружении, но не отображается в выводе sudo env
. Это может происходить потому, что у команд, выполненных через sudo
, может быть ограниченный набор переменных окружения.
Команда sudo echo $ENV
также возвращает пустое значение, потому что вы фактически вызываете echo
в новом контексте, где переменные окружения не наследуются, как это происходит в текущем сеансе оболочки.
3. Использование опции -E
Как вы уже упомянули, использование параметра -E
(например, sudo -E env
) позволяет сохранить существующие переменные окружения при запуске команды с правами суперпользователя. Это может быть полезно, если по каким-то причинам вам нужно сохранить исключительно выбранные переменные окружения.
Вот пример:
sudo -E env | grep ENV
Эта команда должна вернуть переменные окружения, включая вашу переменную ENV
.
4. Альтернативные решения
Ваше решение с использованием алиаса sudo="sudo -i"
в файлах ~/.bashrc
как для пользователя ansible
, так и для root
, действительно является одним из подходов, позволяющим создать интерактивный сеанс оболочки, где все переменные окружения будут загружены как обычно.
Тем не менее, обратите внимание, что этот подход обеспечивает больший доступ и может привести к потенциальным рискам, связанным с безопасностью. Убедитесь, что это решение подходит вашей среде.
Заключение
Чтобы решить проблему отсутствия переменных окружения при выполнении sudo
, вам нужно либо использовать sudo -E
, чтобы сохранить переменные, либо изменить способ выполнения команд через интерактивную оболочку. Важно учитывать безопасность, когда вы работаете с переменными окружения и sudo
. Подходите к этому процессу осторожно и с пониманием возможных последствий для безопасности системы.