错误:EACCES:权限被拒绝

224

我运行npm install lodash,但它抛出Error: EACCES: permission denied的错误。我知道这是一个权限问题,但据我所知,安装本地节点模块不需要sudo权限。如果我使用sudo运行它,则会在~/node_modules文件夹中安装。现有文件夹的文件权限为drwxrwxr-x。我无法弄清楚可能出了什么问题。

以下是错误信息。

npm ERR! tar.unpack untar error /home/rupesh/.npm/lodash/4.13.1/package.tgz
npm ERR! Linux 3.13.0-88-generic
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install" "lodash"
npm ERR! node v4.3.1
npm ERR! npm  v2.14.12
npm ERR! path /home/rupesh/node_modules/lodash
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall mkdir

npm ERR! Error: EACCES: permission denied, mkdir '/home/rupesh/node_modules/lodash'
npm ERR!     at Error (native)
npm ERR!  { [Error: EACCES: permission denied, mkdir '/home/rupesh/node_modules/lodash']
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'mkdir',
npm ERR!   path: '/home/rupesh/node_modules/lodash',
npm ERR!   fstream_type: 'Directory',
npm ERR!   fstream_path: '/home/rupesh/node_modules/lodash',
npm ERR!   fstream_class: 'DirWriter',
npm ERR!   fstream_stack: 
npm ERR!    [ '/usr/local/lib/node_modules/npm/node_modules/fstream/lib/dir-writer.js:35:25',
npm ERR!      '/usr/local/lib/node_modules/npm/node_modules/mkdirp/index.js:47:53',
npm ERR!      'FSReqWrap.oncomplete (fs.js:82:15)' ] }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

npm ERR! Please include the following file with any support request:
npm ERR!     /home/rupesh/Desktop/es6/npm-debug.log

2
文件夹 node_modules 的所有者是根用户吗? - AJS
在我打算安装 lodash 的文件夹中尚未创建 node_module 文件夹。 - xruptronics
你在 /home/rupesh/ 目录下还是其他目录下运行了 npm install 命令? - AJS
我运行npm install的文件夹路径是~/Desktop/es6。 - xruptronics
请确保你是 es6 目录的所有者,然后执行命令 ls -l ~/Desktop | grep es6,看一下输出结果是什么。 - AJS
drwxrwxrwx 3 rupesh rupesh 4096年7月12日14:48 ES6 - xruptronics
29个回答

8

根据你所上传的日志,我所看到的是:

npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'mkdir',
npm ERR!   path: '/home/rupesh/node_modules/lodash',
npm ERR!   fstream_type: 'Directory',
npm ERR!   fstream_path: '/home/rupesh/node_modules/lodash',
npm ERR!   fstream_class: 'DirWriter',

目录 /home/rupesh/node_modules/ 没有必要的权限来创建目录,因此运行 chown -r rupesh:rupesh /home/rupesh/node_modules/ 这样应该解决问题。


执行 chown -R rupesh:rupesh /home/rupesh/node_modules/ 并再次运行 npm install lodash,会在 ~/node_module 文件夹中重新安装 lodash。但是这一次它不会抛出错误。但它并不是我想要安装的地方。 - xruptronics
是的,我知道你应该在你的主目录中创建项目,而不是桌面。npm因某种原因正在安装你的模块在/home/rupesh/node_modules中。无论如何,在你的主目录中工作应该是理想的。 - AJS
我认为/Projects/es6在结构上等同于/Desktop/es6。我遇到的问题是为什么node_modules没有创建在es6文件夹内,以及为什么lodash(或其他)模块没有安装在其中。我之前没有遇到过这个问题,但今天出了什么问题,我想找出原因。 - xruptronics
是的,我读了我之前的两个评论并意识到了愚蠢 :), 好吧,我找了一下,没有发现其他人遇到同样的问题。你的代码能够找到 loadash 模块吗? - AJS

7

如果您遇到以下错误:

Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/<PackageName>/vendor'

我建议使用以下命令安装您的全局包

sudo npm install -g <PackageName> --unsafe-perm=true --allow-root

这个答案似乎是更好的实践。 - JackHacks
这是唯一一个对我的 Mac M1 有效的解决方案,尽管它已经两年了! - user1034912

5
我通过更改npm目录的权限来解决了这个问题。我进入了我的npm全局目录,对于我来说它在以下位置:
/home/<user-name>

我通过输入这个命令进入了这个目录

cd /home/<user-name>

然后通过输入以下命令更改.npm文件夹的权限。

sudo chmod -R 777 ".npm"

对我来说,它像魔法一样奏效。但是,这里存在一个安全漏洞,即所有级别都可以访问您的全局软件包目录。


2
你为什么要允许全世界访问这个特定的文件夹? - Mooncake
无论你想要实现什么目标,chmod 777 都是错误和危险的。在任何情况下,您绝对不希望将可执行文件或系统文件的写访问权限授予所有用户。您需要尽快恢复到正常的权限(对于您的用例,可能是 chmod 755),并在再次尝试使用之前了解 Unix 权限模型。如果这发生在具有 Internet 访问权限的系统上,请检查是否有入侵者可以利用此来提升其特权。 - tripleee

4

说实话,我遇到了同样的症状,但使用了不同的软件包。创建package.json并运行npm init并不能解决我的问题。

在这个系统上,显然在此位置创建的新文件夹是使用root权限创建的。当运行npm install时,会创建新的文件夹。这导致即使使用sudo运行,npm安装也会在中途失败。

解决方案是在没有root umask的不同位置运行npm install app


4
尝试使用以下方法: 在命令行中,在您的主目录下创建一个全局安装目录:
mkdir ~/.npm-global

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

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

在您偏爱的文本编辑器中,打开或创建一个 ~/.profile 文件,并添加此行:
export PATH=~/.npm-global/bin:$PATH

在命令行中,更新系统变量:

source ~/.profile

测试在不使用sudo的情况下全局安装软件包,希望这有所帮助。


3

尝试过后,我按照这个NPM视频的方法操作。

https://www.youtube.com/embed/bxvybxYFq2o

以下是说明(在较旧的Mac上):

  1. 在终端中,在您的用户目录内创建此文件夹: mkdir .npm-global。这将是所有全局NPM安装的新文件夹,而不是具有权限问题的默认.npm。
  2. cd .npm-global/
  3. 运行npm config set prefix /Users/your_user/.npm-global
  4. 为系统设置路径,以便知道在哪里找到软件包:运行vi ~/.profile。如果您没有此文件,请先运行touch ~/.profile,然后再运行vi ~/.profile。在顶部写入export PATH=/Users/your_user/.npm-global/bin:$PATH。您也可以使用文本编辑器打开此文件(因为它是隐藏文件,请使用SHIFT + CMD +。来显示它)。
  5. 回到终端,在 /.npm-global 文件夹内,运行 source ~/.profile

现在您应该准备好全局安装软件包了。

但是,以上内容似乎在像BigSure这样的较新操作系统上无法正常工作。

这可以解决问题:

sudo chown -R `whoami` ~/.npm
sudo chown -R `whoami` /usr/local/lib/node_modules

在我的 macOS 12.1 Monterey 上奏效了,感谢分享视频,并且第四部分的解释帮了我大忙! - Alon Rosenfeld
太简单了,Alon,很高兴能帮到你。 - Pat Racco
2023在Mac M1上无法运行。 - user1034912

2
以下是GNU/Linux(Debian)用户的解决方案(将< strong> USERNAME 替换为< strong>您的用户名):
sudo chown -R $USER:$(id -gn $USER) /home/USERNAME/.config


2

首先在根目录下不要使用-g(全局)安装。之后尝试使用-g(全局)安装。这对我有用。


1
成功了!在 Mac 上,我将我的代码文件夹移动到根文件夹:HardDrive/,然后运行 "npm install" 时没有出现任何问题。接着,我将代码文件夹移回到我想要的位置 HardDrive/users/myUserName/Projects/code,再次运行 "npm install",这一次,它成功了。 - Josh

1

删除dist文件夹,问题解决了!


1

我尝试了大部分建议,但都没有奏效。然后我运行了npm clean-install,问题得到了解决。


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