Мне трудно увидеть разницу между pam_env.conf
и /etc/environment
. Для меня они оба делают одно и то же, с разным синтаксисом. Справочные страницы не помогли. Так в чем же разница?
Кроме того, я хотел бы найти способ добавить пути к переменной среды PATH
для всех пользователей. Добавление их в два вышеупомянутых файла работает для всех пользователей, но не работает с sudo, что можно проверить с помощью команды sudo sh -c 'echo $PATH'
.
Чтобы решить эту проблему, я считаю, что мне нужно отредактировать файл /etc/pam.d/sudo
, но что мне туда добавить?
Существует 2 принципиальных различия между /etc/security/pam_env.conf
и /etc/environment
.
Порядок, в котором PAM обрабатывает их.
/etc/environment
анализируется сначала, но что-либо определенное здесь переопределяется определениями для тех тех же переменных, если они также существуют в pam_env.conf
. Однако возможно включить в категорию +, расширяют переменные от /etc/environment
в /etc/security/pam_env.conf
, например:
/etc/security/pam_env.conf
PATH DEFAULT=${PATH}:/usr/sbin
Переменное расширение
a. /etc/environment
не сценарий, но ряд выражений присваивания, т.е. ${PATH}
не расширяется, но используется буквально.
b. /etc/security/pam_env.conf
другое животное в целом. Это не сценарий по сути; это - все еще просто ряд присвоений KEY=VALUE, но PAM может развернуть существующие переменные (исключая: ${PATH}
, ${DISPLAY}
) и другой PAM_ITEMs (исключая: @{PAM_SERVICE}
, @{PAM_USER}
, и т.д.). Обратите особое внимание на $
по сравнению с @
здесь.
PAM также обрабатывает специальные переменные @{HOME}
и @{SHELL}
, которые расширяются до того, что определяется в /etc/passwd
. *Примечание: в большинстве приложений PAM, традиционных переменных ${HOME}
и ${SHELL}
(сравните @
по сравнению с $
) не доступны это рано в потоке PAM.
Используя пример, данный в комментариях /etc/security/pam_env.conf
, это поведение замены/расширения может использоваться для изменения DISPLAY
переменная для сессий удаленного входа в систему.
/etc/security/pam_env.conf
REMOTE_HOST DEFAULT=localhost OVERRIDE=@{PAM_RHOST}
DISPLAY DEFAULT=${REMOTE_HOST}:0.0 OVERRIDE=${DISPLAY}
К определенной проблеме Вы описали здесь, значения, в которых Вы настроили /etc/environment
не были доступны в sudo
временная среда, потому что session
средство, данное определением приложения PAM для /etc/pam.d/sudo
никогда вызовы pam_env.so
для сессий.
В /etc/pam.d/sudo
, сессии только импортируют правила из /etc/pam.d/system-auth
. После следа, в /etc/pam.d/system-auth
, стопка сессии не имеет записи для pam_env.so
.
Существует несколько способов настроить переменные, доступные в a sudo
среда.
При необходимости в некотором пользовательском наборе переменных среды, которые только существуют на sudo-земле, это довольно просто.
Создайте файл для содержания exclusive-to-sudo переменных среды.
/etc/security/sudo_custom_vars.conf
GREET DEFAULT="hello from sudo land"
VAR1 DEFAULT="${GREET}"
_VAR2 DEFAULT="VAR2 not passed to sudo, ...but"
VAR2 DEFAULT="${_VAR2} ${GREET}" OVERRIDE=${VAR2}
VAR3 DEFAULT="Nope. Unknown users cannot sudo." OVERRIDE=@{PAM_RUSER}
...
Сделайте копию /etc/pam.d/system-auth
, переименуйте его вроде /etc/pam.d/sudo-environment
, и добавьте директиву к нижней части session
стек:
session required pam_unix.so
session optional pam_permit.so
# Add a line for using pam_env.so
session optional pam_env.so conffile=/etc/security/sudo_custom_vars.conf
Если Вы хотите переменные передачи от non-sudo среды, включаете user_readenv=1
флаг
session optional pam_env.so conffile=/etc/security/sudo_custom_vars.conf user_readenv=1
В определении приложения PAM /etc/pam.d/sudo
, сделайте замену:
- session include system-auth
+ session include sudo-environment
Откройте новый терминал для тестирования
$ su <your username> # Testing PAM without logging out
$ export VAR1=""
$ export VAR2="hello from down here" # Set var in non-sudo environment
$ echo $VAR1
<nothing>
$ sudo sh -c 'echo $VAR1' # Test sudo's DEFAULT value
hello from sudo land
$ echo $VAR2
hello from down here
$ sudo sh -c 'echo $VAR2' # VAR2 not passed to sudo
VAR2 not passed to sudo, ...but hello from sudo land
$ sudo -E su -c 'echo $VAR2' # VAR2 (and everything else) passed to sudo
hello from down here
$ sudo env VAR2="inline override" su -c 'echo $VAR2'
inline override
$ sudo sh -c 'echo $VAR3' # Testing we can read a PAM_ITEM
aaron
Альтернатива лужению вокруг с модулями PAM должна отредактировать /etc/sudoers
с # visudo
, как Вы сделали. Я понимаю, что это - старый вопрос и way-back-when, комментируя Default env_reset
был нужно.
Продвижение, принятая лучшая практика при использовании sudoers
вытягивать в определениях переменной от среды означает добавить переменные к env_keep
. (... то есть, если Вам не нужен уникальный набор переменных как показано выше),
/etc/sudoers
Defaults env_keep += "var1 var2, etc..."
Мне удалось получить более или менее то, что я хотел для sudo:
Я отредактировал файл /etc/sudoers
(с sudo visudo
) и закомментировал строки Default env_reset
и Default secure_path = ...
. ]
Теперь sudo будет использовать пользовательскую среду.
Разница между pam_env.conf
и /etc/environment
все еще не ясна для меня, поэтому вопрос еще не дан.