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


Answers:


39

您可以执行此操作而无需调用登录外壳程序:

sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'

要么:

sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'

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


3
我认为“ -E”保留环境变量sudo.ws/man/sudo.man.html
Andy

1
@Andy但是sudo配置经常禁止使用它。
吉尔(Gilles)'所以

@cuonglm-谢谢。这可行。不应该调用登录外壳。
乌芒2015年

1
@kenorb:不,-p是的选择susudo在这种情况下
不可以

还有其他线程说-m保留变量,其他说有-c什么区别?而在这个答案天注释的一个-E stackoverflow.com/questions/10488758/...
Vishrant

49

专家提示:从来没有真正好的理由要跑步sudo su。要以其他用户身份运行命令,请使用sudo -u username command。如果需要root shell,请运行sudo -isudo -l。如果您已经激活了根帐户,那么您也可以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.

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

$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy

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

$ 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

2
保留环境变量的更好方法是将其添加到env_keepsudoers。也许是这样的:Defaults env_keep += "DUMMY"
lcd047

@ lcd047,但这将保留对的所有调用的环境sudo。对于单个变量来说也比较麻烦。这仅对应始终导出的内容有用。
terdon

是的,这是一个折衷,但是并非所有环境变量都同样有害。结转LD_PRELOAD和结转之间有很大的区别LESSCHARDEF。我认为便利性不应成为这里的制胜法宝……
lcd047

1
@ lcd047您的建议当然值得发布。我的观点是,导出任意变量不切实际。是的,如果您始终要导出一个特定的变量,那是要走的路,但是如果您想一次为同一会话中定义的变量执行此操作,则不是这样。
terdon

7

-E为我做这份工作。从人sudo-

-E, 向安全策略指示用户希望保留其现有环境变量。如果用户无权保护环境,则安全策略可能会返回错误。--preserve-env


不幸的是,只有在您的管理员未限制您使用-E的情况下,它才会起作用。
TorstenS

0

接下来是一种不需要更改安全策略的解决方案。

我将忽略该su部分,因为我们可以使用的--user选项sudo

我们想通过将环境变量传递给command运行sudo。但是,sudo不允许将环境变量传递给命令(出于充分的安全考虑,某些变量可能很危险)。外壳程序可用于设置环境变量,sudo并可通过传递脚本的方式运行外壳程序。因此,告诉sudo运行一个设置环境变量的脚本。

var_a=someThing
var_b=someOtherThing

sudo bash -c "
    export var_a=\"${var_a}\"
    export var_b=\"${var_b}\"

    the_command some_args
"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.