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
  • 2,437
  • 3
  • 25
  • 30

2 Answers2

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
  • 59,223
  • 18
  • 147
  • 168
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 :)

kenorb
  • 24,736
  • 27
  • 129
  • 199
gridrunner
  • 41
  • 1