我有预感这台机器刚刚发生了一些不好的事情。
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
.