Sudo can not find binary

3

3

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

Nemoden

Posted 2012-07-25T03:32:08.527

Reputation: 2 007

Question was closed 2016-01-07T19:33:03.427

It did. Why you think it didn't ? – Nemoden – 2014-06-22T06:00:52.510

Related: Why are PATH variables different when running via sudo and su? at Unix SE

– kenorb – 2015-12-24T18:03:44.183

So you marked an answer as accepted, but it did not fix your problem? – T.W.R. Cole – 2014-06-16T19:23:34.917

Answers

7

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"

Paul

Posted 2012-07-25T03:32:08.527

Reputation: 52 173

Thank you for a reply. It seems to be the key, but it does not make a difference. See above the update section of my question. – Nemoden – 2012-07-25T04:46:50.507

Can you add a sudo env | grep PATH to the question? – Paul – 2012-07-25T05:18:34.587

@Nemoden just a ping as I left you off the previous comment – Paul – 2012-07-25T05:49:24.263

Path to /opt/node/bin is not in sudo env | grep PATH: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin – Nemoden – 2012-07-26T01:39:19.937

@Nemoden Answer updated – Paul – 2012-07-26T09:32:56.093

4

I had this problem -> mine was caused by npm being install in /use/local/bin.

And I had this line in my /etc/sudoers file:

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

Typing which npm was the enlightening part :)

gridrunner

Posted 2012-07-25T03:32:08.527

Reputation: 41