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


298

是什么原因导致错误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

9
有关如何解决此问题的信息,请参阅NPM的官方指南:docs.npmjs.com/…–
Dzhuneyt,

Answers:


486

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

首先检查谁拥有目录

ls -la /usr/local/lib/node_modules

它拒绝访问,因为node_module文件夹由root拥有

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

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

id -un

要么

whoami

然后更改所有者

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

3
在某些情况下,在命令中添加sudo也不起作用。这对我有用,应该被接受。
Niroj Shr,

1
我的公司使用Microsoft Active Directory单一登录。因此,组名中包含斜杠和空格。这使得这很难做。我使用的命令是sudo chown -R myuser:Company\\Domain\ Users /usr/local/lib/node_modules。为了正确列出我所做的组名id -gn myuser
帕特里克

44
这很有用,但是当我运行命令更改拥有的所有者时illegal group name。因此,我将命令更改为,sudo chown -R ownerName: /usr/local/lib/node_modules并且它起作用了。
Midori

4
虽然那是正确的答案,但我已经多次遇到此问题,更好的解决方案是使用nvm。这样,您就无需使用来更改文件所有者chowngithub.com/nvm-sh/nvm
Roee

1
与其更改许可,不如在文档中建议使用nvm安装npm。参见stackoverflow.com/a/59575266/2311074
亚当

105

为了最大程度地减少权限错误的可能性,您可以将npm配置为使用其他目录。在此示例中,您将在主目录中创建并使用一个隐藏目录。

备份您的计算机。在命令行的主目录中,为全局安装创建目录:

mkdir ~/.npm-global

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

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

在您喜欢的文本编辑器中,打开或创建一个

~/.profile

文件并添加以下行:

export PATH=~/.npm-global/bin:$PATH

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

source ~/.profile

要测试新配置,请在不使用sudo的情况下全局安装软件包


18
我认为这是破坏力最小的选择。在npm网站上也建议使用
17xande

另外,如果您不想这样做npm config set prefix(尤其是在编写非root用户安装程序时),则可能要覆盖PREFIXenv var或提供该--prefix选项,两者均等效于npm config set prefix。(不确定哪个优先于哪个)
SOFe

这对我来说非常有效。在我看来,此答案使破坏性错误的可能性最小,并且易于理解和实施。
clockelliptic

1
这是在寻找什么!谢谢。
djangodude

实际上,这是推荐的解决方案,从长远来看,这是最好的解决方案。
Al-Mothafar

49

您需要做的就是将USER添加到/ local / lib的所有者中

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

7
如果以后的读者不理解权限,请参考NPM官方文档并正确解决此问题。docs.npmjs.com/…。具体来说,未来的读者可能应该使用节点版本管理器重新安装npm(推荐)
ordonezalex

1
这很简单。这也意味着您不再需要担心lib中的任何事情;您拥有/ usr / local / lib。
Obinna Nnenanya

4
这根本不是一个好的解决方案。通过在上面运行,chown您很有可能破坏整个文件系统的权限结构。
拉尔斯

3
此命令破坏了我所有的权限。需要再次恢复所有的东西。
Azam Alvi

4
确切地说,这不是添加所有者。这改变 主人,这是远远不仅仅是破坏性的增加,并且几乎是毁灭性的sudo chmod -R 777 /
SOFe

29

尝试在要尝试的任何命令之前附加sudo

像这样:sudo npm install

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

超级用户有权访问,修改或删除计算机上几乎所有文件。普通用户帐户可以访问,修改或删除更少的文件。普通帐户的限制可保护您的计算机免受未经授权或有害的程序或用户的侵害。某些过程要求您对通常没有访问权限的文件或文件夹执行操作。安装每个人都可以访问的程序是这些操作之一。

在您的情况下,使用sudo运行安装命令将为您提供超级用户的权限,并允许您修改普通用户无权修改的文件。


57
避免在安装npm软件包时使用sudo。您走得越深,越难解决。只需将权限更改为npm文件夹(如另一个答案中所指出),即可过上更好的生活。
卢卡斯·里西斯

2
那可能行得通,但随着时间的推移会导致连续的问题。如果您不想得到各种拒绝权限的错误,请避免这种情况。像拒绝npm缓存文件夹,拒绝安装等等。
卢卡斯·里西斯

1
应该删除此答案,因为如果用户不理解权限,则在安装软件包之前使用sudo会设置非常危险的先例。请参考第一个答案,在该答案中您一次更改核心节点位置的所有权。
SeaWarrior404 '19

19

我尝试了@okanda给出的答案的解决方案,但对我而言不起作用。

但是,当我为该线程中提到的几个文件夹执行此操作时,它工作得很好:https : //github.com/angular/angular-cli/issues/9676#issuecomment-464857493

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

谢谢,这个回答对我有所帮助。Ubuntu 18.04.3
bakhti_UZB

我之前有其他解决方案,但是由于某种原因,这次将所有这些解决方案都放在了工作文件夹中。谢谢。Mac v 10.15.2
Amir5000 '19

1
在生产服务器中运行安全吗?
Cheezey

16

ubuntu中安装全局软件包时,在写入usr/bin文件夹时需要特殊的写入权限。出于安全原因。因此,每次安装全局软件包时,请使用:

sudo npm install -g [package-name]

对于您的特定情况,它将是:

sudo npm install -g typescript

14

看来您遇到权限问题。如果要安装,npm-packagesEACCES尝试全局安装软件包时可能会出现错误。这意味着您无权写入npm用于存储全局软件包和命令的目录。

尝试运行命令:sudo chmod u+x -R 775 ~/.npmsudo chown $USER -R ~/.npm或者你可以运行任何npm与命令sudo,应该得到解决您的问题。

如果要在npm-package本地安装,则应该在本地项目目录中,并可以尝试运行sudo npm install <pkg-name>命令来安装所需的软件包。使用的目的sudo是它将更改您的所有者权限,以便您可以授权当前用户运行npm命令。

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


10

我正在尝试安装react expo,除了sudo我不得不添加--unsafe-perm

像这样。这解决了我的问题

sudo npm install -g expo-cli --unsafe-perm

@Furquan,非常感谢...尝试了不同的解决方案后,它对我有用。
AzeTech

@AzeTech,我很高兴它有所帮助:D
Furquan

9

如果您在Mac上遇到此问题。按着这些次序

首先使用以下命令检查谁是此文件的所有者

ls -la /usr/local/lib/node_modules

您会在下面找到一些文件,其中一个在下面

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

您是否注意到上面的文件是根用户拥有的,所以要在其中进行更改,因为您需要更改路径的所有者。

您可以通过此命令使用检查谁是当前用户

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

而已。



8

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

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

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

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

您需要做的就是

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

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash

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

然后

  1. 通过nvm安装npm和node.js。为此,只需致电

    nvm install stable

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


感谢亚当的回答!只是想知道以后在构建/环境设置过程中可能会有哪些复杂性?
吖奇说-何魏奇Archy Will He

同样要详细说明,对于fish从事此类工作的人,为了使nvm正常工作,需要使用鱼包装器github.com/FabioAntunes/fish-nvm
奇说-何魏奇Archy Will He

@吖奇说ARCHYSHUō在用nvm安装节点时,我从未听说过任何复杂情况。而且由于它是官方文档中推荐的,所以对我来说,这似乎是最好的选择:)
亚当·

7

使用以下命令以sudo用户身份安装npm

sudo npm install -g create-react-app 

而不是 npm install -g create-react-a pp。


在安装npm软件包时使用sudo引用@ Lukas-。您走得越深,越难解决。只需将权限更改为npm文件夹(如另一个答案中所指出),即可过上更好的生活。
4

6

我可以在Mac中使用以下内容解决此问题。

sudo npm install -g @aws-amplify/cli --unsafe-perm=true

6

对于nvm用户

sudo chown -R $USER /home/bereket/.nvm/versions/node/v8.9.1/lib/node_modules 

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

v8.9.1您正在使用的节点版本替换。


这对我不起作用!仍然收到错误:npm ERR!错误:EACCES:权限被拒绝,重命名为/home/samuel/.nvm/versions/node/v8.10.0/lib/node_modules/.staging/npm-90fab7c7/node_modules/columnify/node_modules/wcwidth/node_modules/defaults尝试安装后,不存在带有/.staging ..那个文件夹的文件。你能帮我吗?
塞缪尔

@Samuel您是否运行了此命令?sudo chown -R $USER home/samuel/.nvm/versions/node/v8.10.0/lib/node_modules
bereket gebredingle

5

似乎您尝试在全局而非本地安装npm软件包,如下man npm install所述:

-g--global参数会导致NPM在全球范围内,而不是在本地安装包。

通常,当您设置一个npm项目(可能还有许多其他项目)时,将包安装在Node.js全局模块(/ usr / local / lib / node_modules)上并不是一个好主意,因为您的调试日志建议。

而不是使用-g,而是使用--save,它会自动将软件包另存为package.json文件的依赖项:

像这样:

$ npm install express-generator --save

$ cat package.json 
{
  "name": "first_app_generator",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
},
  "author": "ivanleoncz",
  "license": "MIT",
  "dependencies": {
    "express-generator": "^4.16.0"
  }
}

但是正如提到的其他答案一样,如果要使用-g,则必须在执行时使用sudo如果用户具有sudo特权:请参见/ etc / sudoersnpm install express-generator -g,但实际上,这不是一个好主意,可能会导致权限问题。

注意

为了使脚本在系统路径上可用,有express-generator使用-g选项安装的说明express-cli.js,但是您也可以使用本地安装的脚本,该脚本位于node_modulesnpm项目:

$ ./node_modules/express-generator/bin/express-cli.js --view=pug myapp

如果出现类似/ usr / bin / env的消息:'node':没有出现这样的文件或目录,请安装nodejs-legacy(Debian / Ubuntu)

恕我直言,如果不确定后果的话,使用-g(也使用sudo)就好像是dracones

了解更多信息:


4

发生这种情况是由于npm无法在node_modules本地运行全局目录

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

例如

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

解决了该问题,现在您可以运行再次运行的命令。


3

简单地,您可以更改所有者,或者在执行以下命令之前仅使用sudo

sudo chown -R [owner]:[owner] /usr/local/lib/node_modules更改所有者

要么

sudo npm install -g json-server

而已。


3

对于linux / ubuntu如果命令

npm install -g <package_name>

npm WARN deprecated superagent@4.1.0: Please note that v5.0.1+ of superagent removes User-Agent header by default, therefore you may need to add it yourself (e.g. GitHub blocks requests without a User-Agent header).  This notice will go away with v5.0.2+ once it is released.

npm ERR! path ../lib/node_modules/<package_name>/bin/..

npm ERR! code EACCES

npm ERR! errno -13

npm ERR! syscall symlink

npm ERR! Error: EACCES: permission denied, symlink '../lib/node_modules
/<package_name>/bin/..' -> '/usr/local/bin/<package_name>'

npm ERR!  { [Error: EACCES: permission denied, symlink '../lib/node_modules/<package_name>/bin/..' -> '/usr/local/bin/<package_name>']

npm ERR!   cause:
npm ERR!    { Error: EACCES: permission denied, symlink '../lib/node_modules/<package_name>/bin/..' -> '/usr/local/bin/<package_name>'

npm ERR!      errno: -13,

npm ERR!      code: 'EACCES',

npm ERR!      syscall: 'symlink',

npm ERR!      path: '../lib/node_modules/<package_name>/bin/..',
npm ERR!      dest: '/usr/local/bin/ionic' },

npm ERR!   stack:
npm ERR!    'Error: EACCES: permission denied, symlink \'../lib/node_modules/ionic/bin/ionic\' -> \'/usr/local/bin/ionic\'',

npm ERR!   errno: -13,

npm ERR!   code: 'EACCES',

npm ERR!   syscall: 'symlink',

npm ERR!   path: '../lib/node_modules/<package-name>/bin/<package-name>',

npm ERR!   dest: '/usr/local/bin/<package-name>' }

npm ERR! 

npm ERR! The operation was rejected by your operating system.

npm ERR! It is likely you do not have the permissions to access this file as the current user

npm ERR! 

npm ERR! If you believe this might be a permissions issue, please double-check the

npm ERR! permissions of the file and its containing directories, or try running

npm ERR! the command again as root/Administrator (though this is not recommended).


npm ERR! A complete log of this run can be found in:

npm ERR!     /home/User/.npm/_logs/2019-07-29T01_20_10_566Z-debug.log

修复:以root权限安装

sudo npm install <package_name> -g


3

您需要超级用户级别的许可才能安装React。在Linux / Unix中,超级用户帐户通常称为“ root”。

要获得超级用户特权,只需在终端上运行以下命令:

sudo -i

然后只需运行命令来安装React:

npm install -g create-react-app

但是,reactjs团队鼓励我们使用以下命令代替安装全局软件包。

npx create-react-app app_name

1
使用sudo是一个冒险的命题,某些软件包可能是安全的,但其他软件包可能会着手做其他事情并利用您授予的root特权。sudo以超级用户
身份

有些软件包create-react-app需要root特权才能作为全局软件包安装。否则,您将无法安装。但是,reactjs团队鼓励我们使用以下命令npx create-react-app app_name代替安装全局软件包。
Fatema T. Zuhora '19



2

经过长期的研究,我了解到Mac OS不需要安装角度cli,只需使用sudo npm install -g @angular/cli您的终端会提示输入密码,然后便会继续安装cli。它为我工作。



2

如果您正在运行Linux(即Arch)

# npm -g install packageName

缺省情况下,此命令将软件包安装在/ usr / lib / node_modules / npm下,并且需要root特权。

允许用户范围内的安装

要允许当前用户安装全局软件包,请设置npm_config_prefix环境变量。npm和yarn都使用它。

~/.profile
PATH="$HOME/.node_modules/bin:$PATH"
export npm_config_prefix=~/.node_modules

重新登录或更新更新源。

您也可以为指定--prefix参数npm install。但是,不建议这样做,因为每次安装全局软件包时都需要添加它。

$ npm -g install packageName --prefix ~/.node_modules

这样您就不必对文件夹进行渗透


1

我可以通过安装来解决此问题nvm,然后将node设置为最新版本。

  1. nvm使用安装curl(有关最新版本,请访问nvm.sh
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
  1. 列出可用的节点版本
nvm ls

v10.12.0
默认-> v10.12(-> v10.12.0)
节点->稳定(-> v10.12.0)(默认)
稳定-> 10.12(-> v10.12.0)

  1. 选择要使用的节点版本
nvm use v10.12

nvm与npm config的“ prefix”选项不兼容:当前设置为“”

  1. 运行此命令以取消设置选项:
nvm use --delete-prefix v10.12.0

完成上述命令后,您将能够在Ubuntu中安装react / angular。



0

我使用过sudo,但无法解决问题,我通过更改node_modules文件夹权限解决了该问题,

sudo chmod -R 777 node_modules

如果您不设置所有用户/组的权限,则可以用其他任何代码替换777。


0

对于使用上述解决方案后仍然无法解决问题的用户。尝试这个

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

那应该成功了,加油!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.