Почему sudo env не показывает все переменные окружения?

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

У меня есть переменная, установленная в скрипте в /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. Подходите к этому процессу осторожно и с пониманием возможных последствий для безопасности системы.

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

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