Linux – Sudo can not find binary

bashrclinuxsudo

I have a problem.

Lately I've installed nodejs (if you don't know what it is, it does not really matter, could be anything else) from sources to /opt/node:

$ ls -la /opt
...
lrwxrwxrwx  1 root root   11 2012-07-25 13:48 node -> node-0.6.3/
drwxr-xr-x  6 root root 4096 2012-07-25 13:48 node-0.6.3
...

so, the binaries are in /opt/node/bin:

$ ls -la /opt/node/bin
...
lrwxrwxrwx 1 root root      38 2012-06-20 11:44 npm -> ../lib/node_modules/npm/bin/npm-cli.js
...

As you can see, npm is there.
To make it easier to use it from a command line I fixed $PATH inside .bashrc script:

HOME=$HOME:...:/opt/node/bin

and so did to the root's .bashrc:

# which npm
/opt/node/bin/npm

But if I run npm with sudo, npm is not found:

$ sudo which npm
$ sudo npm -g install uglify-js
sudo: npm: command not found

So, why is it happening? How do I gain what I want?

Thanks.

UPDATE: Following Paul's advice, I've added

Defaults  env_keep = PATH

to the /etc/sudoers

but the problem persists anyway:

$ echo $PATH
... :/opt/node/bin
$ sudo su -
#
# sudo -V
...
Environment variables to preserve:
    XAUTHORIZATION
    XAUTHORITY
    TZ
    PS2
    PS1
    PATH
...

So, Defaults directive did it's job, but I'm getting the same sudo: npm: command not found

Best Answer

sudo invokes a new shell, and the environmental variables that are passed to the new shell are governed by the '/etc/sudoers' file. If you want your path to be passed through, then you need to add

Defaults env_keep = "PATH"

to '/etc/sudoers' and it will keep the PATH environment variable in the sudo shell

If this does not work, it is possible that either the path is being overwritten by a secure_path directive (sometime a secure_path is compiled in to the binary). If so, try adding this command, replacing the groupname with a group you are a member of:

exempt_group = "groupname"

Or override the secure_path with your own one, eg:

secure_path = "/bin:/usr/bin:/sbin:/usr/sbin:/opt/node/bin"
Related Question