在 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/binsecure_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) 从每行代码中删除/usrsudo 并通过我的控制台运行它们后,什么都没有改变。 这很有帮助。但是任何人都可以解释为什么以及如何让事情发挥作用吗? @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 的节点可以的主要内容,如果未能解决你的问题,请参考以下文章

使用 sudo 运行时找不到命令

Ec2 sudo 运行 npm或node时,出现找不到命令

在 sudo 上找不到命令

找不到快速命令

sudo:npm:找不到命令

sudo: npm:找不到命令