无法从 root(或 sudo)使用 NVM

Posted

技术标签:

【中文标题】无法从 root(或 sudo)使用 NVM【英文标题】:Can't use NVM from root (or sudo) 【发布时间】:2014-02-08 12:06:49 【问题描述】:

我提到我的应用程序在从 sudo 运行时使用不同版本的 NodeJS。

$ 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。我的问题是什么?

【问题讨论】:

尝试sudo -s 然后安装nvm @GamesBrainiac 抱歉,我写过我已经尝试从 root 安装它 尝试删除 /root/.nvm/ 并从头开始重新安装 nvm 没有/root/.nvm。我已经从 sudo 安装了 nvm,它已安装到普通用户 homedir 这解决了我的所有问题,就像你遇到的github.com/xtuple/nvm 【参考方案1】:

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

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

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 上)并设置权限所有用户都可以访问它们。

希望这会有所帮助!

【讨论】:

谢谢,它帮助了我。 谢谢!这为我节省了很多时间 完美!非常感谢。 这听起来是个不错的选择,但我不断收到这些错误: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’ ` sudo su` sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set 哦,加油【参考方案2】:

我的解决方案是从我正在使用的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"

这使得npmnode 可供所有用户使用。

【讨论】:

很好的解决方案。只需在第二行末尾添加“...(由于某种原因我自己无法编辑) 太好了,这是迄今为止最好的解决方案。这样,root 将始终使用与 nvm 用户相同的 npm / node 版本,谢谢! 很好的解决方案,但是如果您更改了正在使用的节点版本,则必须重新运行上述命令。 我经常使用npx。所以我也添加了它:sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npx" "/usr/local/bin/npx" @SimpleJ 你会如何为babel-node做同样的事情【参考方案3】:

根本原因是因为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

【讨论】:

完美。感谢“nvm 不是问题,而是 bash 功能”:) 哈哈,刚刚意识到我拼错了“问题”而不是“程序”;)。【参考方案4】:

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

所以输入

$ which nvm

结果会是这样的

/home/abc/mynvm/nvm

现在用sudo重试:

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

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

【讨论】:

which nvm 没有输出 它也不为 root 输出任何内容 问题是我从来没有以root身份登录。我为什么要?如果我需要任何 root 访问权限,我总是使用sudo。是的,我可以以 root 身份登录并安装 nvm,但以后我无法运行 sudo nvm use v0.10.25。所以我也不能使用用户的sudo node which nvm 从来没有用过,是吗? nvm 不是可执行文件,它是一个 shell 函数。 github.com/creationix/nvm/issues/540 我最近在这里问了一个关于which nvm 的类似问题:***.com/questions/49156104/… 使用type nvm 来揭示它的定义。正如马特所说,它是一个 shell 函数。【参考方案5】:

根据README

使用 nvm 时,您不需要sudo 来全局安装带有npm -g 的模块,因此不要使用sudo npm install -g grunt,而是使用npm install -g grunt

需要 sudo npm 吗?

就我而言,我需要sudo npm run start,它需要访问某些需要 root 访问权限的文件。根据this issue,

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

总之

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

【讨论】:

那么,如果我想使用串口设备,我应该也chmod我的/dev/ttyS0吗?【参考方案6】:

我也遇到了你的问题。最后我已经解决了它。这是我的解决方案:

    卸载 nvm 和 nodejs。以下是一些有用的链接:Uninstallation of nvm。如果你使用 apt-get 安装了 nodejs,你可以使用命令apt-get purge nodejs 卸载它。 安装全局 nvm。请参阅此页面:nvm global。正如它所说,“标准 nvm 已经知道在多用户或 root 环境中工作存在困难。”

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

【讨论】:

这个分支提前 12 次提交,在 creationix:master 后面有 1123 次提交。直接取自 nvm 的 xtuple 存储库【参考方案7】:
$ sudo bash -ic "nvm use stable; npm -v"
Now using node v6.3.1 (npm v3.10.3)
3.10.3

【讨论】:

如果 nvm 不在 root 用户的路径上,这将不起作用,这就是问题所在。【参考方案8】:

我在有nvm 的机器上也试过同样的方法,但我的反应略有不同:

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

我的猜测是您在 nvm 之外安装了节点 0.11。 (通过包管理器甚至源代码

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

这是有道理的还是我弄错了?

【讨论】:

是的,你是对的。我安装了 node,然后安装了 nvm。但是对于普通用户来说一切正常,对 root 用户不起作用。 哦,好吧。然后,我认为 nvm 并不意味着以 root 身份运行。事实上,我很高兴在用户空间中运行是一个想要的功能。但是,这可能会对您有所帮助:github.com/creationix/nvm/issues/5 这家伙显然做了一个特殊的 nvm,在 sudo 模式下运行:github.com/xtuple/nvm。不幸的是,仅在 sudo 模式下。不知道能不能接受【参考方案9】:

最简单的解决方案可能是直接点击 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

【讨论】:

【参考方案10】:

我只想从 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 

【讨论】:

【参考方案11】:

使用wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | sudo bash全局安装 nvm

【讨论】:

creationix 作者 nvm,我会非常小心这个第三方 nvm... 这个分支提前 12 次提交,在 creationix:master 后面有 1123 次提交。这是一个问题,请删除链接 这个答案让我的眼睛流血了。你只是不应该下载任何东西并在 sudo bash 中运行它,wtf 实际上,这些天的 wget 命令以 | bash 结尾,任何地方都没有 sudo:nvm-sh/nvm: Node Version Manager

以上是关于无法从 root(或 sudo)使用 NVM的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Forge 无法运行 sudo 命令

无法使用root权限,又无法使用sudo时获取root权限的方法

系统同时无法使用root和sudo

Ubuntu无法sudo提权,报当前用户不在sudoers文件中错误

无法从 bash 脚本中使用 nvm

ubutu14.04无法使用sudo,也无法切换到root用户去解决问题怎么办?