无法在root(或sudo)下使用NVM

174

我注意到当我使用 sudo 运行应用程序时,它会使用不同版本的NodeJS。

$ node -v
v0.10.23
$ sudo node -v
v0.11.8-pre

这个v0.11.8-pre给我带来了一些问题,所以我肯定不想使用它,但是因为权限的原因我无法更改。

$ sudo nvm use v0.10.23
sudo: nvm: command not found

我尝试以root用户安装nvm,但出现错误“NVM already installed”,但在使用sudo运行时仍然找不到nvm。我的问题是什么?


5
尝试使用sudo -s,然后安装nvm - Games Brainiac
@GamesBrainiac 抱歉,但我已经写了我尝试从根目录安装它。 - Vitalii Korsakov
尝试删除 /root/.nvm/ 并从头重新安装 nvm。 - Antonio E.
没有/root/.nvm。我已经通过sudo安装了nvm,并将其安装到常规用户的主目录中。 - Vitalii Korsakov
5
这解决了我所有的问题,就像你之前提供的 https://github.com/xtuple/nvm 一样。 - Yoo Matsuo
如果您要在sudo下使用nvm,那么您已经错过了nvm的主要目的。'nvm'的全部意义在于:“每个用户都可以安装多个节点版本,并为每个安装的节点版本分别安装不同的节点包”。 - armezit
14个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
317
我的解决方案是创建符号链接,将我正在使用的nodenpm版本链接到/usr/local/bin目录下。
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/node" "/usr/local/bin/node"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npm" "/usr/local/bin/npm"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npx" "/usr/local/bin/npx"
这样就可以让所有用户都能使用npmnpxnode

1
很棒的解决方案。只需在第二行末尾添加“即可。(由于某种原因,我自己无法编辑) - Rayee Roded
1
很好,这是目前为止最好的解决方案。这样,根用户将始终使用与nvm用户相同的npm / node版本,谢谢! - luiscvalmeida
7
很好的解决方案,不过如果你更改了使用的Node版本,你就需要重新运行上述命令。 - door_number_three
8
我经常使用 npx。因此,我也将其添加了:sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npx" "/usr/local/bin/npx" - thomas
@user566245 我认为你上面的评论对于 babel-node 也应该适用。只需要将你尝试使用作为 sudo 的二进制文件创建一个符号链接到 sudo 用户的 PATH 中的目录即可。 - SimpleJ
显示剩余9条评论

266

以下命令列表(来源:digitalocean),似乎可以解决问题。

警告!!!在某些情况下,这些命令可能会破坏您的系统!请确保您知道这些命令要做什么!!!相关

n=$(which node); \
n=${n%/bin/node}; \
chmod -R 755 $n/bin/*; \
sudo cp -r $n/{bin,lib,share} /usr/local

上述命令有点复杂,但它所做的只是将您正在使用的任何版本的 Node 通过 nvm 复制到 /usr/local/ 目录中(用户安装的全局文件应该位于 Linux VPS 上),并设置权限以便所有用户都可以访问它们。


7
谢谢,它帮了我。 - Vishal Kumar Verma
8
谢谢!这节省了我很多时间。 - Quinton Pike
4
太好了!非常感谢。 - Jean-Baptiste Louazel
3
这听起来是个不错的选择,但我一直在遇到这些错误:chmod: cannot operate on dangling symlink ‘/home/ec2-user/.nvm/versions/node/v7.1.0/bin/node-debug’ chmod: cannot operate on dangling symlink ‘/home/ec2-user/.nvm/versions/node/v7.1.0/bin/node-inspector’ - trex005
3
sudo su 的意思是“以超级用户身份进入系统”,而出现的错误提示 sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set 意为“/usr/bin/sudo 必须归 UID 0 所有并设置了 SetUID 位”。最后的表达式 “oh come on” 没有需要翻译的内容。 - tryingHard
显示剩余12条评论

28

根本原因是因为nvm不是一个真正的程序,而是一个bash函数,加载在用户的.profile.bashrc等文件中... 因此,sudo不会像大多数其他程序那样从$PATH自动获取它。

另一个可选的Node.js版本管理器是nhttps://github.com/tj/n。这是一个真正的程序,所以sudo可以通过$PATH轻松获取(只要sudo在其$PATH中有/usr/local/bin)。

sudo npm install -g n  # install 'n' globally
which n                # should be /usr/local/bin/n

sudo n lts             # need sudo to switch node versions
node --version         # v6.10.0
sudo node --version    # v6.10.0

2
太好了。谢谢 "nvm 不是问题,而是一种 bash 函数" :) - another
哈哈,刚意识到我拼错了“问题”(problem)成了“程序”(program);)。 - another
对于我来说,which npm 返回 /home/asc/.nvm/versions/node/v16.17.0/bin/npm,执行 sudo npm install -g n 后跟着 which n 返回 /home/asc/.nvm/versions/node/v16.17.0/bin/n - Rnj

20

你的问题是,当你使用 sudo 时,nvm 不在路径中。

因此,请输入

$ which nvm

结果将会类似于以下内容

/home/abc/mynvm/nvm

现在请使用sudo再次尝试:

sudo /home/abc/mynvm/nvm use v0.10.23

我认为你随后遇到了一个问题,即root用户找不到0.10.13版本,但让我们看看下一个错误信息...


66
"which nvm" 输出为空。 - Vitalii Korsakov
8
对于根用户,它也不会输出任何内容。 - Vitalii Korsakov
4
问题在于我从不以root身份登录。为什么要这样做呢?如果我需要任何root访问权限,我总是使用“sudo”。是的,我可以以root身份登录并安装nvm,但在将来我无法运行“sudo nvm use v0.10.25”,因此我也无法从用户身份下使用“sudo node”。 - Vitalii Korsakov
5
“which nvm”从来没有起作用,是吗?“nvm”不是可执行文件,而是一个shell函数。https://github.com/creationix/nvm/issues/540 - Matt
4
我最近在这里问了一个类似的问题:“which nvm的等效命令是什么?”使用type nvm来查看其定义。正如Matt所说,它是一个shell函数。 - Martin Braun
显示剩余7条评论

19

根据说明文档

使用 nvm 安装模块时,不需要使用 sudo ,只需使用 npm install -g grunt 而非 sudo npm install -g grunt

需要sudo npm吗?

在我的情况下,我需要使用 sudo npm run start 来访问某些需要 root 访问权限的文件。根据该问题

您不需要使用 sudo 。相反,您应该使用 chmod/chown 命令更改文件的权限,使具有 nvm 权限的用户可以访问该文件。

总之

nvm 的维护者强烈认为我们不需要使用 sudo :P


2
那么,如果我想使用串行设备,我也应该将我的 /dev/ttyS0 进行 chmod 操作吗? - bvdb
对于一些软件包来说并不完全正确。 - Costa Michailidis

7
我也曾经遇到过你的问题,最终我解决了它。以下是我的解决方案:
  1. 卸载 nvm 和 nodejs。这里有一些有用的链接:卸载 nvm。如果你使用 apt-get 安装了 nodejs,可以使用命令 apt-get purge nodejs 卸载它。
  2. 安装全局 nvm。请参考此页面:全局 nvm。正如它所说,“标准 nvm 在多用户或根环境中存在已知的困难。”

重新启动终端后,你可以运行命令 sudo nvm ls


2
这个分支比creationix的master分支领先12次提交,落后1123次提交。以上内容摘自xtuple nvm仓库。 - MrMesees

7
$ sudo bash -ic "nvm use stable; npm -v"
Now using node v6.3.1 (npm v3.10.3)
3.10.3

如果nvm不在root用户的路径上,这将无法工作,这就是问题所在。 - thelastshadow

6

扩展@SimpleJ解决方案后,我创建了一个有用的bash脚本,可用于将实际nvm bin目录中的所有二进制文件链接到/usr/local/bin

#!/bin/bash
. ~/.nvm/nvm.sh

DIR=$NVM_DIR/versions/node/$(nvm version)/bin/*
DEST=/usr/local/bin

for filename in $DIR; do
    filename=$(basename $filename)
    DEST_FILE=$DEST/$filename
    echo "Copying $filename to $DEST_FILE"
    sudo ln -sf "$NVM_DIR/versions/node/$(nvm version)/bin/$filename" "$DEST_FILE"
done

4

我在我的电脑上也尝试了相同的操作,我的电脑里也有 nvm,然而我得到的回复略有不同:

$ sudo node --version                                                                                                                                                                    
sudo: node: command not found

我猜测你在nvm之外安装了0.11版本的node。(通过包管理器或者源码编译)

因此,使用sudo命令运行node时会选择这个独立的node版本。

我的理解是否正确?


是的,你说得对。我已经安装了 nodenvm。但是一切都正常工作于普通用户,而在 root 用户下却无法正常工作。 - Vitalii Korsakov
1
好的。那么,我认为 nvm 不应该以 root 用户身份运行。实际上,我相信在用户空间运行是一个期望的特性。不过,这可能会对您有所帮助:https://github.com/creationix/nvm/issues/5 - Aurélien Thieriot
这个家伙显然制作了一个特殊的nvm,可以在sudo模式下运行:https://github.com/xtuple/nvm。不幸的是,只能在sudo模式下运行。我不知道是否可接受。 - Aurélien Thieriot

0

最简单的解决方案可能就是在任何地方运行nvm.sh可执行文件。

sudo /home/ubuntu/.nvm/nvm.sh install node

这对我来说很好用(假设这是安装路径)。

完整的安装过程如下:

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
export NVM_DIR="/home/ubuntu/.nvm"

[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

然后你可以运行上面的命令来调用新安装的nvm.sh


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