错误:EACCES:权限被拒绝,访问'/usr/local/lib/node_modules'。

718

什么可能导致错误 Error: EACCES: permission denied, access '/usr/local/lib/node_modules'

npm ERR! path /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!  { Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/local/lib/node_modules' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/macbookmd101/.npm/_logs/2018-02-21T16_26_08_421Z-debug.log

29
请查看NPM官方指南,了解如何解决这个问题:https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally - Dzhuneyt
你��否更改所选的正确答案?它完全是错误的(即使有近1K的投票),而且也很危险。人们不知道自己在做什么就复制和粘贴,所以不要引导他们搞乱系统。 - angelcervera
43个回答

1108

更改您的文件权限...像这样

首先检查谁拥有该目录

ls -la /usr/local/lib/node_modules

它拒绝访问,因为 node_module 文件夹归 root 所有。

drwxr-xr-x   3 root    wheel  102 Jun 24 23:24 node_modules

因此,需要通过将根更改为您的用户来进行更改,但首先运行以下命令以检查您当前的用户如何通过命令行在OS X中获取活动用户的名称?

id -unwhoami

然后更改所有者

sudo chown -R [owner]:[owner] /usr/local/lib/node_modules

或者

sudo chown -R ownerName: /usr/local/lib/node_modules

或者

sudo chown -R $USER /usr/local/lib/node_modules

10
有时在命令中添加sudo也无效。这对我有用,应该被接受作为答案。 - Niroj Shr
72
这很有帮助,但当我运行更改所有者的命令时,出现了“非法组名”的错误。所以我把命令修改为sudo chown -R ownerName: /usr/local/lib/node_modules,然后它就起作用了。 - Midori
9
虽然那是正确的答案,但我遇到这个问题多次,更好的解决方案是使用 nvm。这样,您就不需要使用 chown 更改文件所有者。https://github.com/nvm-sh/nvm - Roee
7
文档建议使用 nvm 安装 npm,而不是更改权限。请参见 https://dev59.com/N1UM5IYBdhLWcg3wY_e2#59575266。 - Adam
35
请使用https://dev59.com/N1UM5IYBdhLWcg3wY_e2#55274930方法,而不要试图更改`/usr/local/lib/node_modules`的权限。 - Anand Rockzz
显示剩余17条评论

527
为了最小化权限错误的发生,您可以配置npm使用不同的目录。在本例中,您将创建并使用一个隐藏目录在您的主目录中。
备份您的计算机。 在命令行中,在您的主目录中创建一个全局安装目录:
mkdir ~/.npm-global

配置npm使用新的目录路径:

npm config set prefix '~/.npm-global'

在您喜欢的文本编辑器中,打开或创建~/.profile文件,并添加以下行:
export PATH=~/.npm-global/bin:$PATH

在命令行中,更新您的系统变量:
source ~/.profile

为了测试您的新配置,请全局安装一个软件包,而不使用sudo命令。


来源:NPM 网站


97
在我看来,这是最不具破坏性的选择。这也是npm网站推荐的做法 - 17xande
2
或者,如果您不想执行 npm config set prefix(特别是如果您正在编写一个非根安装程序),您可能希望覆盖 PREFIX 环境变量或提供 --prefix 选项,两者都等同于 npm config set prefix。(不确定哪个会覆盖另一个) - SOFe
5
这对我来说完美地起作用了。我认为,这个答案为破坏性错误留下的空间最少,而且非常简单易懂,容易实施。 - clockelliptic
3
要创建.profile文件,请键入touch .profile。然后在Mac上打开它,键入open .profile。而source ~/.profile是一个单独的命令。 - Fotios Tsakiris
5
еҰӮжһңжӮЁдҪҝз”Ёзҡ„жҳҜzshпјҢеҲҷеҸҜд»ҘдҪҝз”Ё~/.zshrcд»Јжӣҝ~/.profileгҖӮ - Bn.F76
显示剩余3条评论

133

我在输出中看到: dest: '/usr/local/bin/.npm-uJtxIR1m'。那么我应该chown /usr/local/bin吗?因为.npm.似乎是一个动态的文件/文件夹? - Timo
https://ionicframework.com/docs/developing/tips#resolving-permission-errors - Ahmed El-Atab
适合我的 - Ammar

91

你需要做的就是将USER添加为/local/lib的所有者

sudo chown -R $USER /usr/local/lib

编辑:

为了精确地定位到 node_modules 文件夹,可以在使用之前尝试使用以下命令:

sudo chown -R $USER /usr/local/lib/node_modules

16
如果未来的读者无法理解权限问题,请参考官方文档NPM文档并适当修复此问题。https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally。具体来说,未来的读者可能应该使用节点版本管理器(推荐)重新安装npm。 - ordonezalex
13
这根本不是一个好的解决方案。通过运行上述的 chown 命令,您会高风险地破坏整个文件系统的权限结构。 - Lars
7
这个命令破坏了我所有的权限,需要重新恢复所有东西。 - Azam Alvi
11
准确来说,这不是添加所有者。这是更改所有者,比仅仅添加所有者要破坏性得多,几乎与“sudo chmod -R 777 /”同样破坏性。 - SOFe
1
它刚才毁了我的Linux系统,我现在无法使用sudo命令了!!! - Nicolas
显示剩余7条评论

49
您可以通过Node版本管理器或Node安装程序安装npm。在文档中指出:

我们不建议使用Node安装程序,因为Node安装过程会将npm安装在具有本地权限的目录中,并在全局运行npm包时可能导致权限错误。

NPM实际上建议使用Node版本管理器来避免这些错误。

由于您遇到了权限错误,您可能是通过Node安装程序安装的npm,现在您需要使用nvm(Node版本管理器)重新安装它。

幸运的是,这非常简单。您甚至不需要删除当前版本的npm或Node.js。

您只需要做以下事情:

  1. 安装nvm。 对于OSX或Linux Node,请使用:

     curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/<VERSION>/install.sh | bash
    

其中<VERSION>应替换为最新版本

这将在您的主目录中创建一个nvm文件夹。

然后

  1. 通过nvm安装npm和node.js。只需调用以下命令:

 nvm install node 

("node"是最新版本的别名)

现在,您可以全局安装软件包,而无需使用sudo或更改usr文件夹中node_modules的所有者。


1
谢谢!我注意到NVM有一个新的小版本,所以我猜命令应该是curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash。此外,我不得不关闭并重新打开终端才能运行nvm install stable - Johanna
作为 zsh 用户,我必须执行以下操作。将“cat .bashrc | grep nvm”的输出复制到我的 .zshrc 文件中。然后在我的 zsh 中就可以使用 nvm 了。 - Totem
5
这是我看过的最简单和最清晰的答案。它避免了对文件夹权限进行调整或强制使用“sudo”的混乱情况。我认为这应该是被采纳的答案。谢谢! - Christian Gossain
1
这解决了我的问题,当出现与 OP 相同的错误时,我无法安装 npm install -g mongodb-realm-cli - Falnésio
1
太棒了!这应该是被接受的答案! - DarkteK
显示剩余8条评论

47

尝试在你要执行的命令前面添加sudo

像这样:sudo npm install

在Linux/UNIX中,使用sudo命令通常会将您的权限提升到超级用户级别。在Windows中,超级用户帐户通常称为“管理员”。在Linux/Unix中,超级用户帐户通常被命名为“root”。

root用户拥有访问、修改或删除计算机上几乎任何文件的权限。普通用户帐户只能访问、修改或删除较少的文件。普通帐户上的限制可以保护您的计算机免受未经授权或有害程序或用户的侵害。一些进程需要您针对您通常无权访问的文件或文件夹执行操作。安装所有人都可以访问的程序就是其中之一。

在您的情况下,使用sudo运行安装命令会给您超级用户的权限,并允许您修改您的普通用户没有权限修改的文件。


84
安装 npm 包时尽量避免使用 sudo。深入使用此方法后,修复问题会变得更加困难。只需按另一个答案中指出的更改 npm 文件夹的权限,并过上更好的生活。 - Lukas Liesis
2
这可能有效,但随着时间的推移,它会引起持续的问题。如果您不想遇到各种权限被拒绝的错误,最好避免这样做。例如,被拒绝访问npm缓存文件夹、被拒绝安装等等。 - Lukas Liesis
1
这个答案应该被移除,因为在安装软件包之前使用sudo设置了非常危险的先例,如果用户不理解权限,请参考第一个答案,在那里您可以一次更改核心节点位置的所有权。 - SeaWarrior404
或者至少这是标准的幻觉...有太多的方法可以从用户级别获得root访问权限,这些方法在多年后仍未修补,因此可以安全地假设任何恶意用户只要能够访问您的计算机,就可以通过任何安全性较差的应用程序轻松获得root访问权限。 - Tcll
https://ionicframework.com/docs/developing/tips#resolving-permission-errors - Ahmed El-Atab
这个回答很危险。"只需使用sudo"而不是找到潜在问题是一个非常非常糟糕的习惯。不要教导别人这样做。 - Wayne Walker

33
如果您在 Mac 上遇到此问题,请执行以下步骤: 首先,使用下面的命令确定谁拥有此文件。
ls -la /usr/local/lib/node_modules

以下是一些文件,其中一个如下所示。

drwxr-xr-x   3 root    wheel  768 May 29 02:21 node_modules

你是否注意到上面的文件是由 root 拥有的?要在其中进行更改,必须更改路径的所有权。

这个命令可以用来确定当前用户是谁。

id -un (in my case user is Yamsol)

然后,您可以通过调用此命令来更改(只需将您的用户名替换为ownerName)

sudo chown -R ownerName: /usr/local/lib/node_modules

在我的情况下,你知道用户是“yamsol”,我会这样调用这个命令

sudo chown -R yamsol: /usr/local/lib/node_modules

就这样。


可以使用 $USER:$USER 来避免查找用户ID。 - venimus

28

看起来你遇到了权限问题。如果你正在安装 npm-packages,那么在尝试全局安装包时可能会出现 EACCES 错误。这意味着你没有权限写入 npm 用于存储全局包和命令的目录。

尝试运行以下命令:sudo chmod u+x -R 775 ~/.npmsudo chown $USER -R ~/.npm 或者你可以直接使用 sudo 运行任何 npm 命令,这应该可以解决你的问题。

如果你正在本地安装一个 npm-package,那么你应该在你的本地项目目录中,并尝试运行 sudo npm install <pkg-name> 命令来安装所需的包。使用 sudo 的目的是更改你的所有者权限,以便你的当前用户有权运行 npm 命令。

我建议你查看 https://docs.npmjs.com/getting-started/fixing-npm-permissions


25

在安装 ubuntu 的全局包时,由于需要写入 usr/bin 文件夹,因此您需要特殊的写权限。这是为了安全起见。 因此,每次安装全局包时,请使用:

sudo npm install -g [package-name]

对于您的具体情况,将是:

sudo npm install -g typescript

21

注意,所有更改 /usr/local 目录下所有目录所有者的响应都要小心。基本上,不要搞乱 Linux 系统!!!

对于您的本地事务使用 sudo 是一个非常糟糕的建议

www.competa.com 的原始链接已经失效,因此这是从那里得到的原始方法:

npm config set prefix ~/.npm

# open your .bashrc (Linux) or .bash_profile (Mac) file for editing:
nano ~/.bashrc # for Linux
# or...
nano ~/.bash_profile # for Mac if you haven't created a .bashrc file

# add these lines:
export PATH="$PATH:$HOME/npm/bin"
export NODE_PATH="$NODE_PATH:$HOME/npm/lib/node_modules"

# save the file and then enter this command or logout and login to make the changes take effect:
. ~/.bashrc
# or...
. ~/.bash_profile

方案B:使用类似NVM的版本管理器。


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