I have a problem related to nodejs. I have nodejs binaries here: ~/node-v8.5.0-linux-x64/
and I have a soft link that I created using: ln -s node-v8.5.0-linux-x64/ node
.
In my .bashrc, I have this: export PATH=$PATH:$HOME/node/bin
.
node
and npm
are working great when I'm normally logged in. As both of them are installed in my home, I don't need to be logged in as root to install a package globally.
But I wanted to try; so, I ran:
sudo npm install -g angular-cli
sudo node app.js
and it didn't work.
sudo: nodeĀ : command not found
I thought maybe the $PATH
changes when I use sudo
but then I checked it using sudo echo $PATH
:
/home/dc/bin:/home/dc/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/dc/node/bin
The shell should know where to go when I type node
command, but it seems it doesn't. I also tried -H
, -i
and -u
options for sudo
but none of that helps either.
Can someone please explain what's happening here?
Best Answer
No,
sudo
does not preserve your$PATH
environment variable for security reasons. Instead, it gets replaced with asecure_path
defined in/etc/sudoers
, which you should not change.You think to have verified that the
$PATH
variable stays the same with your commandbut actually Bash expands variables before starting to execute any (here the
sudo
) command, which means the line above shows your own$PATH
value. To get the one assudo
, use e.g.What you can do is to e.g. resolve the command you want to run (
node
ornpm
) in your own user's shell using process substitution withwhich
:This first runs
which npm
orwhich node
as your user, which returns the absolute path of the executables belonging to the specified commands. Then that output is literally inserted into yoursudo
command, sosudo
actually believes it got executed with absolute paths like below, removing the need to look anything up in$PATH
: