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 -i或sudo -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)
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。
小智 10
-E 为我完成这项工作。从人sudo——
-E, 表示用户希望预先设置的安全策略?为其现有的环境变量提供服务。如果用户没有权限,安全策略可能会返回错误?力保护环境。--preserve-env