我基本上需要这样做:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
这行不通。如何将env变量$ DUMMY传递给su?-p与-l不兼容。
我基本上需要这样做:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
这行不通。如何将env变量$ DUMMY传递给su?-p与-l不兼容。
Answers:
您可以执行此操作而无需调用登录外壳程序:
sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'
要么:
sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'
该-p
的选项su
命令保存环境变量。
-p
是的选择su
,sudo
在这种情况下
专家提示:从来没有真正好的理由要跑步sudo su
。要以其他用户身份运行命令,请使用sudo -u username command
。如果需要root shell,请运行sudo -i
或sudo -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
env_keep
中sudoers
。也许是这样的:Defaults env_keep += "DUMMY"
。
sudo
。对于单个变量来说也比较麻烦。这仅对应始终导出的内容有用。
LD_PRELOAD
和结转之间有很大的区别LESSCHARDEF
。我认为便利性不应成为这里的制胜法宝……
-E为我做这份工作。从人sudo
-
-E
, 向安全策略指示用户希望保留其现有环境变量。如果用户无权保护环境,则安全策略可能会返回错误。--preserve-env
接下来是一种不需要更改安全策略的解决方案。
我将忽略该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
"
sudo -iu ec2-user echo $DUMMY
吗?