What do you do when you try to sudo and root's PATH has gone kerblooey?

I’ve got a feeling something bad just happened to this machine.

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

This is an old unmaintained machine I’ve been using for a while.
Assuming it was going to die some day. Looks like this might be the day.
It starting throwing errors a bit earlier, and it looks like someone just
rebooted it.

UPDATE: After running

sudo -s

I checked the value of path

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

So some stuff is missing from here, e.g. sbin, and /usr/sbin.

UPDATE 2:

As it turns out, person or persons unknown deleted the following lines
from /etc/sudoers.

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

Thanks to Anthony for explaining.

Asked By: Faheem Mitha

||

As the ‘Note:’ at the bottom of your sudo dpkg -i output hints at, this is usually caused by $PATH being set wrong. One way that happens is when you run dpkg -i without root; but that isn’t the case here.

An easy way to confirm the path is to run sudo -s, which tells sudo to run a shell instead of some other program. So you’ll be landed at a root shell prompt. If you echo "$PATH", you’ll likely find /sbin and/or /usr/sbin missing.

sudo’s default behavior is to keep your user’s $PATH variable intact. That default is normally changed by Debian’s default /etc/sudoers, which contains:

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

If you’re missing the secure_path line, that’d explain the problem.

Two options are to add that line back (but someone may have removed it because he/she wanted the user path to be carried over, e.g., because it contains extra elements in /opt, for example) or to add /sbin:/usr/sbin to your user’s $PATH.

Answered By: derobert
Categories: Answers Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.