有没有一种方法(无需跳过太多的圈)来运行sudo -u
user command
以这样的方式user
的环境被完全保留了吗?
基本上,我需要的是确保为所有允许运行 sudo 的用户设置特定的环境变量以模拟某些 ID - 主要是PATH
、JAVA_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