我对以下内容感到困惑:
[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
这里有两个问题
该
$PATH
变量在命令运行之前被扩展。最终结果是你得到了这个,虽然有效但并不是你真正想要的:sudo echo /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin
出于安全原因
$PATH
通常会重置sudo
您可以用来在运行应用程序的上下文中sudo env | grep ^PATH=
查找该值。您可以调整用于编辑此文件的路径,以便获得语法检查的好处$PATH
sudo
/etc/sudoers
sudo visudo
前你改变了文件。
答案2
读man sudo sudoers
。sudo
命令故意忽略用户的$PATH
,以避免轻易的安全漏洞。