Sudo - 目标用户环境

Sudo - 目标用户环境

有没有一种方法(无需跳过太多的圈)来运行sudo -uuser command以这样的方式user的环境被完全保留了吗?

基本上,我需要的是确保为所有允许运行 sudo 的用户设置特定的环境变量以模拟某些 ID - 主要是PATHJAVA_HOME和数据库相关的(Oracle 和 Postgres)变量。

换句话说 - 当我作为用户wobble运行时,sudo -u wibble echo $PATH我希望看到wibble显示的路径而不是wobble的路径。

答案1

您当然可以对所有用户或给定用户进行以下操作,但它适用于所有命令sudo -u anyuser。编辑/etc/sudoers文件并添加一行,例如

Defaults env_keep+="PATH JAVA_HOME"

对于所有用户,或者

Defaults:wobble env_keep+="PATH JAVA_HOME"

只是摇摆,以及您想要保留的所有变量。实际上,PATH通常是一种特殊情况,并且会被重置,因此您可能需要使用类似的条目来取消它

Defaults:wobble  !secure_path, env_keep+="PATH JAVA_HOME"

显然,这些功能的存在是有充分理由的,所以要小心。

sudo -E还可以通过 sudoers 条目来保护环境,例如:

wobble ALL = (wibble) SETENV: ALL

但这仍然会重置特殊情况的 PATH,尽管您可以运行类似的命令

sudo -E PATH=$PATH -u wibble ...

答案2

您可以使用sudo -i来完成用户的完整登录过程,因此sudo -i -u wibble command将以 wibble 身份登录,设置其所有环境变量并以该用户身份运行命令。

但是sudo -i -u wibble echo $HOME仍然会打印出您的主路径。这是因为您的提示符在 sudo 启动之前就扩展了 $HOME var,而 sudo 对此无能为力。因此,如果您需要通过命令行传递环境变量,则必须对其进行正确转义,以下是一些示例:

sudo echo $HOME
> /home/user
sudo -i echo '$HOME'
> /root
sudo echo '$HOME'
> $HOME
sudo bash -c 'echo $HOME'
> /root
sudo -i bash -c 'echo $HOME'
> /root

对于所有这些,您可以添加-u wibble(在命令之前)以将它们作为 wibble 运行。

答案3

我想你正在寻找

sudo su - USER

这将启动一个只有用户环境变量(SUDO_USER等也被删除):

   -, -l, --login
          Start the shell as a login shell with an environment similar to a real login

相关内容