Linux 为什么userA$sudo su userB-c';printenv';isn';t打印userB的环境详细信息
我有两个用户userA和userB 我想打印userB的环境详细信息。我正在从userA运行下面的命令Linux 为什么userA$sudo su userB-c';printenv';isn';t打印userB的环境详细信息,linux,shell,unix,environment-variables,Linux,Shell,Unix,Environment Variables,我有两个用户userA和userB 我想打印userB的环境详细信息。我正在从userA运行下面的命令 userA$ sudo su userB -c 'printenv' 但它会打印userA的环境细节。如何解决这个问题 如果我切换到userB并执行printenv,那么它会按预期打印userB的环境详细信息。同样的情况也发生在PYTHONPATH和其他变量上 注意,我需要像在单个命令中那样运行该命令。我不能先切换到userB,然后运行printenv您应该使用以下命令: userA$ su
userA$ sudo su userB -c 'printenv'
但它会打印userA的环境细节。如何解决这个问题
如果我切换到userB并执行printenv
,那么它会按预期打印userB的环境详细信息。同样的情况也发生在PYTHONPATH
和其他变量上
注意,我需要像在单个命令中那样运行该命令。我不能先切换到userB,然后运行printenv
您应该使用以下命令:
userA$ sudo su - userB -c 'printenv'
su使用连字符(-)将环境变量更改为新用户~/.bashrc指定的环境变量。您应该使用以下选项:
userA$ sudo su - userB -c 'printenv'
su带连字符(-)将环境变量更改为新用户~/.bashrc指定的环境变量。2014年7月su手册: 建议始终使用
--login
选项(而不是
它的快捷方式-
),以避免混合引起的副作用
环境
及
-
,-l
,-登录
将shell作为登录shell启动,环境类似于真实登录:
- 清除除术语之外的所有环境变量
- 初始化环境变量
、HOME
、SHELL
、USER
和LOGNAME
PATH
- 对目标用户主目录的更改
- 将shell的
设置为“argv[0]
”,以使shell成为登录shell-
当shell是登录shell时,它的启动过程与交互shell时不同。bash手册页提供了有关这方面的进一步信息。来自2014年7月的su手册页: 建议始终使用
--login
选项(而不是
它的快捷方式-
),以避免混合引起的副作用
环境
及
-
,-l
,-登录
将shell作为登录shell启动,环境类似于真实登录:
- 清除除术语之外的所有环境变量
- 初始化环境变量
、HOME
、SHELL
、USER
和LOGNAME
PATH
- 对目标用户主目录的更改
- 将shell的
设置为“argv[0]
”,以使shell成为登录shell-
当shell是登录shell时,它的启动过程与交互shell时不同。bash手册页提供了有关这方面的更多信息。您似乎混淆了您的概念。环境变量属于流程,而不是用户。作为一个用户,我有许多不同环境的流程 您似乎对查找用户登录shell所处的环境感兴趣。为此,您可以提供
su
任何-
,-l
,--login
命令选项:
-
,-l
,-登录
提供一个类似于用户直接登录时所期望的环境
当使用-
时,必须在任何用户名之前指定它。为了便于携带,建议在进行任何操作之前,将其作为最后一个选项使用
用户名。其他表单(-l
和-login
)没有此功能
限制
请注意,用户的init文件可能不会生成与您获得的完全相同的环境-例如,如果任何初始化取决于终端类型、是否设置了$DISPLAY
,或者取决于月亮的相位
你也应该考虑<代码> SUDO-I/代码>,这可能比“代码> SUDO SU-
你似乎混淆了你的概念。环境变量属于流程,而不是用户。作为一个用户,我有许多不同环境的流程
您似乎对查找用户登录shell所处的环境感兴趣。为此,您可以提供su
任何-
,-l
,--login
命令选项:
-
,-l
,-登录
提供一个类似于用户直接登录时所期望的环境
当使用-
时,必须在任何用户名之前指定它。为了便于携带,建议在进行任何操作之前,将其作为最后一个选项使用
用户名。其他表单(-l
和-login
)没有此功能
限制
请注意,用户的init文件可能不会生成与您获得的完全相同的环境-例如,如果任何初始化取决于终端类型、是否设置了$DISPLAY
,或者取决于月亮的相位
你也应该考虑<代码> SUDO-I/代码>,它可以比“代码> SUDO SU-给出更简单的命令,效果相当。
我不确定,但我认为你需要输入<代码> SU-SUBRB <代码>,而不是<代码> SU-UBRB<代码>。但是我认为您需要键入su-userB
而不是su-userB
。这属于@DanielA.White:或。