为什么userA $ sudo su userB -c'printenv'不打印userB的环境细节

时间:2016-10-20 11:39:07

标签: linux shell unix environment-variables

我有两个用户userA和userB。

我想打印userB的env细节。我从userA运行以下命令。

userA$ sudo su userB -c 'printenv'

但是它打印了userA的环境细节。怎么解决?

如果我切换到userB并执行printenv,那么它会按预期打印userB的环境详细信息。 PYTHONPATH和其他变量也发生了同样的事情。

注意我需要在单个命令中运行这样的命令。我无法先切换到userB,然后运行printenv

3 个答案:

答案 0 :(得分:4)

你应该用这个:

userA$ sudo su - userB -c 'printenv'
带有连字符( - )的

su 将环境变量更改为新用户的环境变量,如〜/ .bashrc所示。

答案 1 :(得分:1)

从2014年7月起的su pagepage:

  

建议始终使用--login选项(相反   其快捷方式-),以避免混合造成的副作用   的环境中。

  

--l--login

     

将shell作为登录shell启动,其环境类似于真实登录:

     
      
  • 清除除TERM
  • 之外的所有环境变量   
  • 初始化环境变量HOMESHELLUSERLOGNAMEPATH
  •   
  • 更改目标用户的主目录
  •   
  • 将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 -更简单的命令,效果大致相同。