我有两个用户userA和userB。
我想打印userB的env细节。我从userA运行以下命令。
userA$ sudo su userB -c 'printenv'
但是它打印了userA的环境细节。怎么解决?
如果我切换到userB并执行printenv
,那么它会按预期打印userB的环境详细信息。 PYTHONPATH
和其他变量也发生了同样的事情。
注意我需要在单个命令中运行这样的命令。我无法先切换到userB,然后运行printenv
。
答案 0 :(得分:4)
你应该用这个:
userA$ sudo su - userB -c 'printenv'
带有连字符( - )的su 将环境变量更改为新用户的环境变量,如〜/ .bashrc所示。
答案 1 :(得分:1)
从2014年7月起的su pagepage:
建议始终使用
--login
选项(相反 其快捷方式-
),以避免混合造成的副作用 的环境中。
和
-
,-l
,--login
将shell作为登录shell启动,其环境类似于真实登录:
- 清除除
之外的所有环境变量TERM
- 初始化环境变量
HOME
,SHELL
,USER
,LOGNAME
和PATH
- 更改目标用户的主目录
- 将shell的
argv[0]
设置为&{39;-
'为了使shell成为登录shell
当shell是登录shell时,其启动过程与交互式shell不同。 bash联机帮助页提供了有关此内容的更多信息。
答案 2 :(得分:1)
你似乎在困惑你的概念。环境变量属于进程,而不属于用户。作为用户,我有许多不同环境的流程。
您似乎有兴趣找到用户的登录shell 所具有的环境。为此,您可以su
-
,-l
,--login
命令选项{/ 1}}:
-
,-l
,--login
提供类似于用户在用户直接登录时所期望的环境。
使用
-
时,必须在任何用户名之前指定。{p>为了便于携带,建议在任何之前使用它作为最后一个选项 用户名。其他形式(-l
和--login
)没有这个 限制。
请注意,用户的初始化文件可能无法生成与您获得的完全相同的环境 - 例如,如果任何初始化取决于终端类型,是否设置了$DISPLAY
,或月亮的阶段。
您还应该考虑sudo -i
,它可以提供比sudo su -
更简单的命令,效果大致相同。