无法从 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】:
我的解决方案是从我正在使用的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
可供所有用户使用。
【讨论】:
很好的解决方案。只需在第二行末尾添加“...(由于某种原因我自己无法编辑) 太好了,这是迄今为止最好的解决方案。这样,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的主要内容,如果未能解决你的问题,请参考以下文章
无法使用root权限,又无法使用sudo时获取root权限的方法