即使正确传递了 $PATH,`sudo` 也没有使用正确的二进制文件

即使正确传递了 $PATH,`sudo` 也没有使用正确的二进制文件

我正在尝试以 root 身份运行 Pipenv python 实例。不以 root 身份运行时:

(myenv) $ python script.py

Pipenv python 已正确使用。但是,以 root 身份运行时sudo

(myenv) $ sudo python script.py

系统默认的 python at/usr/bin/python被使用。经过一番搜索,我找到了-Esudo 选项。但是,

(myenv) $ sudo -E python script.py

它仍然使用/usr/bin/python,即使sudo -E echo $PATH给出的结果与相同echo $PATH,因此-E选项工作正常;但是,sudo -E which python继续给出/usr/bin/python!这不是权限或访问问题,因为 Pipenv python 的完整路径工作正常。为什么即使$PATH设置正确,也会使用错误的二进制文件?

答案1

好的,问题就出在这里。当我进行故障排除时,我想在 sudo 中找到 $PATH 的值。但是,使用 时sudo -E echo $PATH,我的用户(非 sudo)shell 会自动扩展它,因此 sudo 只会看到

echo /home/user/.local/share/virtualenvs/environment-_Sko9eTd/bin:/usr/bin/:......

尝试sudo -E env告诉我们真实的故事:

LANGUAGE=en_GB:en
# more environment variables ...
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ^^ doesn't include my Pipenv path

所以实际上,sudo -E没有通过$PATH。要解决这个问题,您可以看到这个答案类似问题。本质上你只需添加

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

添加到您的 sudoers 文件visudo

相关内容