在EC2上:sudo node命令未找到,但不使用sudo的node是可以的。

134

我刚刚在一个新的EC2微实例上安装了nodejs。

我按照通常的方法安装它:./configure -> make -> sudo make install。

问题:当我在ec2-user下运行“node”时,它可以正常运行。但是当我运行“sudo node”时则会失败。

我发现node位于:

[ec2-user@XXXX ~]$ whereis node
node: /usr/local/bin/node /usr/local/lib/node

当前路径为

[ec2-user@XXXX ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/opt/aws/bin:/home/ec2-user/bin

但是,sudo的路径是:

[root@ip-10-112-222-32 ~]# echo $PATH
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin

然后我尝试编辑root PATH以包括到node的路径,这样当我以root身份登录时,“node”就可以运行 - 但是当我以ec2-user身份登录并运行“sudo node”时仍无法工作。

我需要这样做才能正确安装npm。有任何想法如何在运行“sudo node”时包含node路径吗?


你是如何编辑根路径(root PATH)的? - Dennis Williamson
经过多次尝试,我做到了并且它可以工作:<pre> sudo su export PATH=$PATH:usr/local/node/ curl http://npmjs.org/install.sh | sh </pre> - user806812
15个回答

333

是的,这有点烦人,但您可以通过一些链接来解决:

sudo ln -s /usr/local/bin/node /usr/bin/node
sudo ln -s /usr/local/lib/node /usr/lib/node
sudo ln -s /usr/local/bin/npm /usr/bin/npm
sudo ln -s /usr/local/bin/node-waf /usr/bin/node-waf

可能还有其他问题,但目前为止这就是我遇到的全部。缺少node-waf可能导致一些npm安装失败,并显示一个相当难以理解的错误消息。


1
缺少 node-waf 导致 npm rebuild 出错。有没有干净的解决方法?我需要吗? - user730569
1
这对我来说没有起作用,原因有几个。1)我没有sudo访问权限,我在共享主机上。2)/usr/local不存在,但我创建了一个目录~/local。3)在从每行代码中删除/usr和sudo并通过控制台运行它们后,什么也没有改变。 - Wolfpack'08
1
那很有帮助。但是有人能解释一下为什么以及如何使它们工作吗? - Tarun Gupta
2
@Tarun:请了解一下shell的PATH变量以及它是如何用于查找任何给定命令要执行的二进制文件的。ln命令只是将第二个名称链接到同一个文件。 - Michael Dillon
1
我正在使用亚马逊Linux。这行代码‘sudo ln -s /usr/local/lib/node /usr/lib/node’的意思是应该改为‘sudo ln -s /usr/local/lib/node_modules /usr/lib/node_modules’吗? - stevejay
显示剩余4条评论

38

这是因为在 /usr/bin 中未找到 node 可执行文件。请按照以下步骤操作:

  1. 查找 node:

whereis node

在我的情况下:node: /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node

  1. 为 node 创建一个符号链接:

    sudo ln -s /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node /usr/bin/node

完成!


2
很好的提示 - 我也执行了 sudo ln -s /home/ec2-user/.nvm/versions/node/v8.11.3/bin/npm /usr/bin/npm,因为我在按照链接的步骤在我的AWS EC2实例上尝试执行sudo npm install - NULL pointer
你是一个救命恩人和绝对的传奇。+1 - o_in25

34

我在/etc/sudoers中的secure_path中添加了/usr/local/bin

$ sudo visudo

然后更改这一行:

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

收件人:

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

14

为什么不使用 Node 的绝对路径?如果你计划使用 upstart 脚本,它肯定需要一个绝对路径。

sudo /usr/local/bin/node server.js

2
最佳解决方案,能够正常工作而不像所有的“ln”解决方案一样干扰系统。 - SidOfc

6

请尝试以下方法:

export PATH=$PATH:/usr/local/bin
sudo node --version

2
无法在 sudoers 文件中设置了 secure_path 的发行版上运行。 - kenorb

6
您可以使用which命令从父进程(非sudo shell)传递node可执行文件的完整路径,如下所示:
sudo `which node`

5
试一下使用 "sudo $(which node)" 代替 "sudo node"?

4

对我来说,只需将节点文件夹的所有权从 root 更改为 ec2-user (作为 ec2-user 登录)。

(注意:我在 /var/lib/ 中创建了我的节点文件夹)

sudo chown -R ec2-user /var/lib/node/

那么

npm install mongojs

如果您已经成功安装了npm,那么应该可以正常工作!


3

以下是一种不使用符号链接或需要root权限的方法:

$ git clone https://github.com/joyent/node.git
$ cd node
$ mkdir ~/opt
$ export PREFIX=~/opt; ./configure
$ make
$ make install
$ echo 'export PATH=~/opt/bin:${PATH}' >> ~/.bashrc

然后我执行了以下操作:
$ git clone https://github.com/isaacs/npm.git
$ cd npm
$ make install

讨论了不以root身份运行node的好处,请参见以下链接:

http://increaseyourgeek.wordpress.com/2010/08/18/install-node-js-without-using-sudo/


它与以下内容一致:

https://github.com/joyent/node/wiki/Installation


1
如果您已经安装了Node环境,请将以下命令粘贴到您的实例中,它将链接您的节点到您的用户目录。然后您就可以使用sudo来使用Node了。
    sudo ln -s "$(which node)" "/usr/local/bin/node"
    sudo ln -s "$(which npm)" "/usr/local/bin/npm"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接