Linux 为什么userA$sudo su userB-c';printenv';isn';t打印userB的环境详细信息

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和userB

我想打印userB的环境详细信息。我正在从userA运行下面的命令

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:或。