不能从 root(或 sudo)使用 NVM

问题描述 投票:0回答:14

我注意到我的应用程序在运行时使用了不同版本的 NodeJS

sudo
.

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

这个v0.11.8-pre给我带来了一些问题,所以我肯定不想用它,但我不能换成root。

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

我尝试从 root 用户安装 nvm,但出现错误“NVM 已安装”,但从

sudo
运行时仍然找不到 nvm。我的问题是什么?

node.js nvm
14个回答
283
投票

我的解决方案是从我使用的

node
npm
版本创建符号链接
/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"

这使得

npm
node
对所有用户可用。


265
投票

下面的命令列表(来源:digitalocean)似乎解决了这个问题

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

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

上面的命令有点复杂,但它所做的就是通过 nvm 将您激活的任何版本的节点复制到

/usr/local/
目录(用户安装的全局文件应该位于 linux VPS 上)并设置权限,以便所有用户可以访问它们。


27
投票

根本原因是因为

nvm
不是真正的程序。这是一个 bash 函数,加载到用户的
.profile
.bashrc
或...所以
sudo
不会像大多数其他程序一样自动从 $PATH 中获取它。

另一个节点版本管理器是

n
https://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

21
投票

你的问题是,当你使用

nvm
时,
sudo
不在路径中。

所以输入

$ which nvm

结果会是这样的

/home/abc/mynvm/nvm

现在再试一次

sudo

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

我假设您随后遇到了 root 用户找不到 0.10.13 版本的问题,但让我们看看下一条错误消息...


18
投票

根据README

使用 nvm 时,您不需要

sudo
来使用
npm -g
全局安装模块,因此不要执行
sudo npm install -g grunt
,而是执行
npm install -g grunt

需要 sudo npm?

在我的例子中,我需要

sudo npm run start
需要访问一些需要 root 访问权限的文件。根据本期

你不使用

sudo
。您应该改用 chmod/chown 文件,以便拥有 nvm 的用户可以访问该文件;.

总结

nvm 的维护者坚信我们不需要

sudo
:P


7
投票

我也有你的问题。最后我解决了它。这是我的解决方案:

  1. 卸载 nvm 和 nodejs。这里有一些有用的链接:卸载 nvm。如果你使用 apt-get 安装了 nodejs,你可以使用命令
    apt-get purge nodejs
    .
  2. 卸载它
  3. 安装全局 nvm。请参阅此页面:nvm global。正如它所说,“标准 nvm 在多用户或 root 环境中工作有困难。”

重启终端后,您可以运行命令

sudo nvm ls
.


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

5
投票

通过扩展@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 之外安装了 node 0.11。 (通过包管理器甚至来自源头

因此,通过 sudo 运行节点会选择这个独立节点。

这有道理还是我错了?


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


0
投票

我只想从 NVM API 安装最新的 node-js,而不需要额外的包清除版本。所以我一直在寻找 SUDO nvm install-latest-npm。 Mb 这对你有用 - 它对我来说绝对有用,无需安装/删除任何 apts。 (显然更改 YOUR_USER_DIRECTORY 以适合您的系统)

sudo /home/YOUR_USER_DIRECTORY/.nvm/nvm.sh | nvm install-latest-npm 

0
投票

我以非特权用户的身份安装了

nvm
node

要将它们用作 sudo,我将其添加到超级用户的

.bashrc
文件中:

$ sudo bash -c 'echo $HOME/.bashrc'
/root/.bashrc

要添加到

/root/.bashrc
的内容(替换
<your-user>
):

# Lazy load NVM/NPM/Node
lazynvm() {
  unset -f nvm node npm
  export NVM_DIR=/home/<your-user>/.nvm
  [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
}

nvm() {
  lazynvm
  nvm $@
}

node() {
  lazynvm
  node $@
}

npm() {
  lazynvm
  npm $@
}

0
投票

最简单的方法是制作

PATH
变量以包含您的
/bin
NVM_DIR
位置。这是例子:

export NVM_DIR="$HOME/.nvm"
  [ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"  # This loads nvm
  [ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"  # This loads nvm bash_completion

添加此行以使 PATH 变量包含来自 NVM 的 Node 二进制文件

export PATH="$NVM_DIR/versions/node/$(nvm version)/bin:$PATH"

希望有帮助。


-3
投票

全局安装 nvm

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | sudo bash

© www.soinside.com 2019 - 2024. All rights reserved.