当您尝试使用 sudo 且 root 的 PATH 已变为 kerblooey 时,您会怎么做?

当您尝试使用 sudo 且 root 的 PATH 已变为 kerblooey 时,您会怎么做?

我有预感这台机器刚刚发生了一些不好的事情。

faheem@bulldog:/usr/local/src/mercurial$ sudo dpkg -i 
mercurial_3.0-1_amd64.deb mercurial-common_3.0-1_all.deb    
dpkg: warning: 'ldconfig' not found in PATH or not executable 
dpkg: warning: 'start-stop-daemon' not found in PATH or not executable 
dpkg: error: 2 expected programs not found in PATH or not executable 
Note: root's PATH should usually contain /usr/local/sbin, /usr/sbin
and /sbin

这是一台未经维护的旧机器,我已经使用了一段时间了。假设有一天它会死。看来今天可能就是这一天了。它开始抛出错误的时间有点早,看起来就像有人刚刚重新启动了它。

更新:运行后

sudo -s

我检查了路径的值

echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games

所以这里缺少一些东西,例如sbin, 和/usr/sbin

更新2:

事实证明,一个或多个不明身份的人从 中删除了以下几行/etc/sudoers

Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

感谢安东尼的解释。

答案1

正如输出底部的“注意:”所sudo dpkg -i暗示的那样,这通常是由于$PATH设置错误引起的。发生这种情况的一种方式是当您在dpkg -i没有 root 的情况下运行时;但这里的情况并非如此。

确认路径的一个简单方法是运行 run sudo -s,它告诉 sudo 运行 shell 而不是其他程序。因此,您将进入 root shell 提示符。如果您这样做echo "$PATH",您可能会发现/sbin和/或/usr/sbin丢失。

sudo 的默认行为是保持用户$PATH变量完整。该默认值通常会被 Debian 的 default 更改/etc/sudoers,其中包含:

Defaults        env_reset
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

如果你漏掉了这条secure_path线,那就可以解释问题了。

有两个选项是将该行添加回来(但有人可能已删除它,因为他/她希望保留用户路径,例如,因为它在 中包含额外的元素/opt)或添加/sbin:/usr/sbin到用户的$PATH.

相关内容