Node.js 在EC2上:未找到sudo node命令,但没有sudo的节点正常
我刚刚在一个新的EC2微实例上安装了nodejs 我正常安装,./configure->make->sudo make安装 问题:当我在ec2用户下运行“node”时,它运行得非常好。当我运行“sudo节点”时,它失败了 我发现节点位于:Node.js 在EC2上:未找到sudo node命令,但没有sudo的节点正常,node.js,bash,amazon-ec2,sudo,Node.js,Bash,Amazon Ec2,Sudo,我刚刚在一个新的EC2微实例上安装了nodejs 我正常安装,./configure->make->sudo make安装 问题:当我在ec2用户下运行“node”时,它运行得非常好。当我运行“sudo节点”时,它失败了 我发现节点位于: [ec2-user@XXXX ~]$ whereis node node: /usr/local/bin/node /usr/local/lib/node 当前的路径是 [ec2-user@XXXX ~]$ echo $PATH /usr/local/bin
[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
然后我尝试编辑根路径以包含到节点的路径,这样当我以根用户身份登录时“节点”就会运行,但当我以ec2用户身份登录并运行“sudo节点”时,它仍然无法工作
我需要这个来正确安装npm。关于如何在运行“sudo node”时包含节点路径,您有什么想法吗?请尝试以下操作:
export PATH=$PATH:/usr/local/bin
sudo node --version
为什么不使用节点的绝对路径?如果您计划使用upstart脚本,那么无论如何都需要绝对路径
sudo /usr/local/bin/node server.js
是的,这有点烦人,但您可以通过以下链接修复:
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
可能还有更多,但这就是我到目前为止遇到的所有问题。缺少节点waf将导致某些npm安装失败,并显示一条相当隐晦的错误消息。我不知道这是否正确,但我就是这么做的
sudo su
export PATH=$PATH:/home/ec2-user/local/node/bin
curl http://npmjs.org/install.sh | sh
chown -R ec2-user /home/ec2-user/local/node
exit
这安装了npm,我现在可以安装我想要的任何软件包 这里有一种不使用符号链接或不需要根的方法:
$ 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用户身份运行节点的好处:
其内容与:
对我来说,只需将节点文件夹的所有权从根用户更改为ec2用户(以ec2用户身份登录)即可 (注意:我在/var/lib/中创建了我的节点文件夹) 然后
应该可以正常工作(如果您安装了npm,当然可以!)我在
/etc/sudoers
中向安全路径添加了/usr/local/bin
$ sudo visudo
然后更改此行:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
致:
您可以使用which
命令从父级(非sudo shell)向节点
可执行文件传递完整路径
sudo `which node`
在我的例子中,节点安装时没有sudo前缀。因此,超级用户无法使用该节点,这就是为什么它不能工作的原因。sudo node server
发生这种情况是因为在/usr/bin中找不到该节点的可执行文件。因此,请遵循以下步骤:
查找节点:
节点在哪里
在我的例子中:node:/home/.nvm/versions/node/v8.9.4/bin/node
为节点创建符号链接:
sudo ln-s/home/.nvm/versions/node/v8.9.4/bin/node/usr/bin/node
完成了 使用“sudo$(哪个节点)”而不是“sudo节点”怎么样?使用
sudo su
然后呢
这就是我为解决类似问题所做的。注意:我已经通过snap安装了node
步骤1:通过快照安装节点
sudo snap install node --classic
步骤2:查找节点的安装位置
whereis node
就我而言
/snap/bin/node.npm
/snap/bin/node.npx
/snap/bin/node.yarn
/snap/bin/node
/snap/bin/node.yarnpkg
步骤3:创建指向节点、npm、npx和纱线的符号链接
sudo ln -s /snap/bin/yarn /usr/bin/yarn
sudo ln -s /snap/bin/node /usr/bin/node
sudo ln -s /snap/bin/npm /usr/bin/npm
最后,所有用户都可以访问该节点,即使是sudo组
sudo node
您是如何编辑根路径的?经过多次尝试,我这样做了,并且成功了:sudo su export PATH=$PATH:usr/local/node/curl | sh我只是好奇,这个链接是否只需要在Amazon AMI系统中完成?AmazonAMI系统是否将根路径和用户路径分开?出于几个原因,这对我来说不起作用。1) 我没有sudo权限。我在共享主机上。2) /usr/local
不存在。不过,我制作了一个~/local目录。3) 从每一行代码中删除/usr
和sudo
并通过我的控制台运行它们之后,没有任何变化。这很有帮助。但是,有人能解释为什么以及它是如何工作的吗?@Tarun:仔细阅读shell的PATH变量,以及如何使用它来查找任何给定命令要执行的二进制文件。ln命令只是将第二个名称链接到同一个文件。我使用的是Amazon Linux。行'sudo ln-s/usr/local/lib/node/usr/lib/node'是否意味着'sudo ln-s/usr/local/lib/node_modules/usr/lib/node_modules'?对于在sudoers
文件中设置了secure_路径的发行版不起作用。伟大的提示-我也做了sudo ln-s/home/ec2 user/.nvm/versions/node/v8.11.3/bin/npm/usr/bin/npm>在遵循最佳解决方案后,我尝试在我的aws ec2实例上安装sudonpm
,与所有ln
解决方案一样有效,不会干扰系统。似乎是唯一有效的解决方案
whereis node
/snap/bin/node.npm
/snap/bin/node.npx
/snap/bin/node.yarn
/snap/bin/node
/snap/bin/node.yarnpkg
sudo ln -s /snap/bin/yarn /usr/bin/yarn
sudo ln -s /snap/bin/node /usr/bin/node
sudo ln -s /snap/bin/npm /usr/bin/npm
sudo node