如何将环境变量传递给 sudo su

Uma*_*ang 45 linux su sudo environment-variables

我基本上需要这样做:

DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
Run Code Online (Sandbox Code Playgroud)

这不起作用。如何将环境变量 $DUMMY 传递给 su?-p 不适用于 -l。

ter*_*don 64

专业提示:从来没有真正好的理由运行sudo su. 要以其他用户身份运行命令,请使用sudo -u username command. 如果你想要一个 root shell,运行sudo -isudo -l. 如果你已经激活了root账户,你也可以su单独运行,sudo su只是没有用。是的,我知道你到处都能看到它。

也就是说,sudo具有-E将保留用户会话环境的开关:

 -E, --preserve-env
        Indicates to the security policy that the user wishes to preserve 
        their existing environment variables.  The security policy may
        return an error if the user does not have permission to 
        preserve the environment.
Run Code Online (Sandbox Code Playgroud)

因此,您首先需要导出变量,然后运行sudo -E

$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy
Run Code Online (Sandbox Code Playgroud)

bash -c是没有必要的。但是,如果我运行sudo -Eu bob echo "$DUMMY",变量会在 root shell 启动之前展开,因此它不能证明该命令确实有效:

$ sudo -u bob echo $DUMMY  ## looks like it works but doesn't
dummy
$ sudo -u bob bash -c 'echo D:$DUMMY' ## now we see it failed
D:
$ sudo -Eu bob bash -c 'echo D:$DUMMY'  ## works as expected
D:dummy
Run Code Online (Sandbox Code Playgroud)

  • 保存环境变量的更好方法是将其添加到 `sudoers` 中的 `env_keep`。也许像这样:`默认 env_keep += "DUMMY"`。 (3认同)
  • @lcd047 但这将为“sudo”的_所有_调用保留环境。对于单个变量来说也比较麻烦。这仅对应始终导出的内容有用。 (2认同)
  • @lcd047 您的建议当然值得作为答案发布。我的观点是导出任意变量是不切实际的。是的,如果您始终希望导出某个特定变量,那么这是可行的方法,但如果您想为同一会话中定义的变量执行一次此操作,则不行。 (2认同)

cuo*_*glm 52

您可以在不调用登录 shell 的情况下执行此操作:

sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'
Run Code Online (Sandbox Code Playgroud)

或者:

sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'
Run Code Online (Sandbox Code Playgroud)

命令保留环境变量的-p选项su

  • 我认为“-E”保留环境变量 http://www.sudo.ws/man/sudo.man.html (3认同)
  • @kenorb:不,在这种情况下,`-p` 是`su` 的选项,而不是`sudo` (2认同)

小智 10

-E 为我完成这项工作。从人sudo——

-E, 表示用户希望预先设置的安全策略?为其现有的环境变量提供服务。如果用户没有权限,安全策略可能会返回错误?力保护环境。--preserve-env