sudo echo path 不显示用于作为 sudo 执行的路径

sudo echo path 不显示用于作为 sudo 执行的路径

我对以下内容感到困惑:

[user@QVr740-11 ~]$ which ninja
/usr/local/bin/ninja
[user@QVr740-11 ~]$ sudo which ninja
which: no ninja in (/sbin:/bin:/usr/sbin:/usr/bin)
[user@QVr740-11 ~]$ sudo echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin

ls -l /usr/local/bin/ninja显示该二进制文件由 root:root 所有,并且可由所有人(三个 x)执行,并$PATH显示即使作为 sudo,它也应该位于路径中,但是当我去执行时which,路径已经以某种方式改变了。

sudo -E不会改变这种行为。

是什么赋予了? $PATH 是否被保留?正在which其他地方寻找路径(请注意,我无法将这个二进制文件作为 sudo 执行)。

答案1

这里有两个问题

  1. $PATH变量在命令运行之前被扩展。最终结果是你得到了这个,虽然有效但并不是你真正想要的:

    sudo echo /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin
    
  2. 出于安全原因$PATH通常会重置sudo

您可以用来在运行应用程序的上下文中sudo env | grep ^PATH=查找该值。您可以调整用于编辑此文件的路径,以便获得语法检查的好处$PATHsudo/etc/sudoerssudo visudo你改变了文件。

答案2

man sudo sudoerssudo命令故意忽略用户的$PATH,以避免轻易的安全漏洞。

相关内容