/etc/security/pam_env.conf和/ etc / environment之间的区别+使sudo读取pam_env.conf
我很难看到pam_env.conf
和/etc/environment
之间的区别。 对我来说,他们都做同样的事情,语法不同。 这些联机帮助没有帮助。 那么区别是什么呢?
另外,我想找到一种方法为所有用户添加PATH
环境变量的PATH
。 将它们添加到上述两个文件适用于所有用户,但不能与sudo一起使用,因为可以通过运行sudo sh -c 'echo $PATH'
来validation。
为了解决这个问题,我相信我应该编辑文件/etc/pam.d/sudo
,但是我应该把它放在那里?
/etc/security/pam_env.conf
和/etc/environment
之间存在两个根本区别。
-
PAM处理它们的顺序。
首先解析
/etc/environment
,但是如果这些相同变量的定义也存在于pam_env.conf
则此处定义的任何内容都会被覆盖。 但是,可以在/etc/security/pam_env.conf
包含+扩展/etc/environment
中的变量,例如:/etc/security/pam_env.conf PATH DEFAULT=${PATH}:/usr/sbin
-
可变扩展
一个。
/etc/environment
不是一个脚本,但是一组赋值表达式,即${PATH}
不会扩展,而是按字面意思使用。湾
/etc/security/pam_env.conf
是一个完全不同的动物。 它本身不是一个脚本; 它仍然只是一组KEY = VALUE赋值,但PAM可以扩展现有变量(例如:${PATH}
,${DISPLAY}
)和其他PAM_ITEM(例如:@{PAM_SERVICE}
,@{PAM_USER}
等)。 请特别注意$
vs@
here。PAM还处理特殊变量
@{HOME}
和@{SHELL}
,它们扩展为/etc/passwd
定义的任何变量。 *注意:在大多数PAM应用程序中,传统变量${HOME}
和${SHELL}
(比较@
vs$
)在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
临时环境中不可用,因为/etc/pam.d/sudo
的PAM应用程序定义给出的session
工具从不调用pam_env.so
对于会议。
在/etc/pam.d/sudo
,会话仅从/etc/pam.d/sudo
导入规则。 跟踪路径后,在/etc/pam.d/system-auth
,会话堆栈没有pam_env.so
的条目。
有几种方法可以自定义sudo
环境中可用的变量。
如果您需要一些仅存在于sudo-land中的自定义环境变量集,那么它非常简单。
-
创建一个文件以包含您的独家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
如果要从非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
# Testing PAM without logging out $ export VAR1="" $ export VAR2="hello from down here" # Set var in non-sudo environment $ echo $VAR1 $ 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模块修补的另一种方法是使用#visudo编辑/etc/sudoers
,就像你一样。 我意识到这是一个古老的问题和回归时,评论Default env_reset
是要做的事情。
env_keep
,使用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
之间的区别对我来说仍然不明确,所以这个问题还没有回答。