在 EC2 上:找不到 sudo 节点命令,但没有 sudo 的节点可以
Posted
技术标签:
【中文标题】在 EC2 上:找不到 sudo 节点命令,但没有 sudo 的节点可以【英文标题】:On EC2: sudo node command not found, but node without sudo is ok 【发布时间】:2011-06-25 23:42:44 【问题描述】:我刚刚在一个新的 EC2 微型实例上安装了 nodejs。
我安装正常,./configure -> make -> sudo make install。
问题:当我在 ec2-user 下运行“node”时,它运行良好。当我运行“sudo 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 身份登录时“节点”运行 - 但当我以 ec2-user 身份登录并运行时它仍然无法工作“须藤节点”。
我需要这个来正确安装 npm。关于在运行“sudo node”时如何包含节点路径的任何想法?
【问题讨论】:
你是如何编辑根路径的? 经过多次尝试,我做到了,它成功了:sudo su export PATH=$PATH:usr/local/node/ curl npmjs.org/install.sh | sh【参考方案1】:
我尝试了上述答案中提到的所有方法,但没有任何效果。可能是因为我对与符号链接相关的概念缺乏理解。我通过不使用 nvm 解决了这个问题。 我刚刚创建了一个新的 ec2 实例并没有安装 nvm。相反,我像这样安装了 node 和 npm:
sudo apt update
sudo apt install nodejs npm
这对我有用。
【讨论】:
【参考方案2】:这是我为解决类似问题所做的。注意:我已经通过 snap 安装了节点。
第 1 步:通过 snap 安装节点
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 步:创建指向 node、npm、npx 和 yarn 的符号链接
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
【讨论】:
【参考方案3】:以root身份输入
sudo su
然后做standard steps
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
. ~/.nvm/nvm.sh
nvm install node
node -e "console.log('Running Node.js ' + process.version)"
【讨论】:
【参考方案4】:用“sudo $(which node)”代替“sudo node”怎么样?
【讨论】:
【参考方案5】:这是因为在 /usr/bin 中找不到节点可执行文件。所以请按照以下步骤操作:
-
找到节点:
whereis node
就我而言:node: /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node
为节点创建符号链接:
sudo ln -s /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node /usr/bin/node
完成了!
【讨论】:
很棒的提示 - 我也做了sudo ln -s /home/ec2-user/.nvm/versions/node/v8.11.3/bin/npm /usr/bin/npm
,因为我在关注 link 之后尝试在我的 aws ec2 实例上执行 sudo npm install
【参考方案6】:
在我的例子中,Node 安装时没有 sudo 前缀。所以超级用户无法使用节点,为什么它不工作sudo node server
【讨论】:
【参考方案7】:您可以使用which
命令从父级(非sudo shell)传递node
可执行文件的完整路径。
sudo `which node`
【讨论】:
【参考方案8】:我在/etc/sudoers
中添加了/usr/local/bin
到secure_path
$ sudo visudo
然后改变这一行:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
收件人:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
【讨论】:
【参考方案9】:对我来说,它只是将节点文件夹的所有权从 root 更改为 ec2-user(以 ec2-user 身份登录)。
(注意:我在 /var/lib/ 中创建了我的节点文件夹)
sudo chown -R ec2-user /var/lib/node/
然后
npm install mongojs
应该可以正常工作(当然前提是你已经安装了 npm ok!)
【讨论】:
【参考方案10】:这是一种不使用符号链接或需要 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 身份运行节点的好处:
http://increaseyourgeek.wordpress.com/2010/08/18/install-node-js-without-using-sudo/
它的内联:
https://github.com/joyent/node/wiki/Installation
【讨论】:
【参考方案11】:我不知道这是否是正确的方法,但这就是我所做的......
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,我现在可以安装任何我想要的包。
【讨论】:
【参考方案12】:是的,这有点烦人,但您可以通过一些链接修复它:
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
安装失败并显示相当神秘的错误消息。
【讨论】:
缺少node-waf
会导致npm rebuild
出错。有没有一种干净的方法来解决这个问题?我需要吗?
这对我不起作用有几个原因。 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'?【参考方案13】:
为什么不使用节点的绝对路径?如果您打算使用新贵脚本,则无论如何都需要绝对路径。
sudo /usr/local/bin/node server.js
【讨论】:
最佳解决方案,有效且不会像所有ln
解决方案那样干扰系统。【参考方案14】:
尝试以下方法:
export PATH=$PATH:/usr/local/bin
sudo node --version
【讨论】:
不适用于在sudoers
文件中设置了secure_path
的发行版。以上是关于在 EC2 上:找不到 sudo 节点命令,但没有 sudo 的节点可以的主要内容,如果未能解决你的问题,请参考以下文章