如何让 sudo 保留 $PATH?

如何让 sudo 保留 $PATH?

我有一个程序安装在 /opt 下的自定义目录中。为了更容易运行它,我编辑了 bashrc 以将所述目录添加到我的路径中:

export PATH=$PATH:/opt/godi/bin:/opt/godi/sbin

如果我想在没有 sudo 的情况下运行程序,这很好用。但是,如果我尝试使用 sudo 运行它,它会失败并出现“找不到命令”错误。

$ sudo godi_console
sudo: godi_console: command not found

使用 sudo 后检查 PATH 变量发现它不包含与普通用户相同的 PATH:

$ sudo sh
# echo $PATH                 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

为什么路径不一样?难道我做错了什么?我使用的是 Debian Jessie,如果它有什么区别的话。

我尝试的一件事是直接调用 /opt/godi/sbin/godi_console ,将绝对路径传递给可执行文件。不幸的是,这在这种特殊情况下没有帮助,因为 godi_console 本身取决于正确设置的 PATH。

答案1

你总是可以这样做:

sudo env "PATH=$PATH" godi_console

作为 Debian 上的一项安全措施,/etc/sudoerssecure_path选项设置为安全值。

注意:

sudo "PATH=$PATH" godi_console

其中sudo将包含字符的前导参数=本身视为环境变量分配,也适用于godi_console运行你的 $PATH(与 相对secure_path) 在其环境中,但不会影响sudo可执行文件的搜索路径,因此无助sudo于找到该文件godi_console

答案2

您还可以将默认路径设置为/etc/sudoers

使用编辑文件visudo

并将该行更新为您想要的内容: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

答案3

SUDO 默认情况下会重置环境变量。

查看其手册和名为 env_reset 的选项。

您只需在 /etc/sudoers 中禁用它即可。

答案4

sudo --preserve-env=PATH env [command]

这个 ovverrides secure_path 在我这边

相关内容