【问题标题】:Error: EACCES: permission denied, access '/usr/local/lib/node_modules'错误:EACCES:权限被拒绝,访问“/usr/local/lib/node_modules”
【发布时间】:2018-08-01 07:51:15
【问题描述】:

什么可能导致错误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

【问题讨论】:

标签: node.js npm permission-denied


【解决方案1】:

您似乎遇到了权限问题。如果您正在安装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

【讨论】:

    【解决方案2】:

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

    像这样:sudo npm install

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

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

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

    【讨论】:

    • 在安装 npm 包时避免使用 sudo。你走得越深,以后就越难修复它。只需按照另一个答案中的指示更改对 npm 文件夹的权限,并过上更好的生活。
    • 这可能有效,但随着时间的推移会导致持续出现问题。如果您不想获得所有类型的权限被拒绝错误,请避免这种情况。比如拒绝npm缓存文件夹,拒绝安装等等。
    • 这个答案应该被删除,因为如果用户不理解权限,在安装软件包之前使用 sudo 会设置一个非常危险的先例。请参阅您更改核心节点位置所有权一次的第一个答案。
    • 或者至少这是标准的错觉...有太多的方法可以从多年未修补的用户级别获得 root 访问权限,因此可以安全地假设任何恶意用户可以通过您安装的任何安全性较差的应用程序轻松获得 root 访问权限。
    【解决方案3】:

    使用此命令安装npm 作为 sudo 用户:

    sudo npm install -g create-react-app 
    

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

    【讨论】:

    • 引用@Lukas- 在安装 npm 包时使用 sudo。你在这条路上走得越深,之后就越难修复它。只需按照另一个答案中的指示更改对 npm 文件夹的权限,并过上更好的生活。
    • 不是一个好主意。我建议反对它。你用这种方式打开另一罐蠕虫。
    【解决方案4】:

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

    首先检查谁拥有该目录

    ls -la /usr/local/lib/node_modules
    

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

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

    所以这需要通过将 root 更改为您的用户来更改,但首先运行下面的命令以检查您当前的用户 How do I get the name of the active user via the command line in 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
    

    【讨论】:

    • 在某些情况下,在命令中添加 sudo 也不起作用。这对我有用,应该被接受。
    • 这很有帮助,但是当我运行命令更改所有者时,我得到了illegal group name。所以我将命令更改为sudo chown -R ownerName: /usr/local/lib/node_modules,它起作用了。
    • 虽然这是正确的答案,但我多次遇到此问题,更好的解决方案是使用 nvm。这样您就不需要使用chown 更改文件所有者。 github.com/nvm-sh/nvm
    • 建议在文档中使用 nvm 安装 npm,而不是更改权限。见stackoverflow.com/a/59575266/2311074
    • **STOP**? 做stackoverflow.com/a/55274930/234110 而不是弄乱/usr/local/lib/node_modules 的权限
    【解决方案5】:

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

    sudo npm install -g [package-name]
    

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

    sudo npm install -g typescript
    

    【讨论】:

      【解决方案6】:

      小心所有更改 /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

      【讨论】:

        【解决方案7】:

        就像man npm install 描述的那样,您似乎试图在全局而不是本地安装 npm 包:

        -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/sudoers)执行npm install express-generator -g,但确实不是一个好主意,可能会导致权限问题。

        通知

        有安装express-generator-g 选项的说明,以便在系统路径上使用脚本express-cli.js,但您也可以使用本地安装的脚本,位于node_modules if你的 npm 项目:

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

        如果出现 /usr/bin/env: ‘node’: No such file or directory 之类的消息,请安装 nodejs-legacy (Debian/Ubuntu)

        恕我直言,如果您不确定后果,使用 -g(也使用 sudo)就像 hic sunt dracones

        更多信息:

        【讨论】:

          【解决方案8】:

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

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

          编辑:

          要精确定位 node_modules 文件夹,请在使用上一个命令之前尝试使用此命令:

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

          【讨论】:

          • 如果以后的读者不理解权限,那么请参考官方文档NPM文档并正确修复问题。 docs.npmjs.com/…。具体来说,未来的读者可能应该使用节点版本管理器重新安装 npm(推荐)
          • 这很简单。这也意味着你再也不用担心 lib 中的任何事情了;你拥有 /usr/local/lib。
          • 这根本不是一个好的解决方案。通过在chown 上运行,您很有可能破坏整个文件系统的权限结构。
          • 这个命令破坏了我的所有权限。需要再次恢复所有的东西。
          • 确切地说,这不是添加所有者。这是改变 所有者,这比仅仅添加 更具破坏性,几乎和sudo chmod -R 777 / 一样具有破坏性。
          【解决方案9】:

          您可以在这样的命令之前更改所有者或只使用 sudo

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

          sudo npm install -g json-server
          

          就是这样。

          【讨论】:

            【解决方案10】:

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

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

            mkdir ~/.npm-global

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

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

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

            ~/.profile

            文件并添加这一行:

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

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

            source ~/.profile

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

            【讨论】:

            • 在我看来,这是破坏性最小的选项。也是recommended in the npm website
            • 另外,如果您不想使用npm config set prefix(尤其是如果您正在编写非root 安装程序),您可能需要覆盖PREFIX 环境变量或提供@ 987654329@ 选项,两者都等价于npm config set prefix。 (不确定哪个会覆盖哪个)
            • 这对我来说非常有效。在我看来,这个答案使破坏性错误的空间最小,并且非常易于理解和实施。
            • 这就是我们要找的东西!谢谢。
            • 这实际上是推荐的解决方案,也是长期最好的解决方案。
            【解决方案11】:

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

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

            sudo -i
            

            然后简单地运行命令来安装 React:

            npm install -g create-react-app
            

            不过,reactjs 团队鼓励我们使用以下命令,而不是安装全局包。

            npx create-react-app app_name
            

            【讨论】:

            • 使用 sudo 是一个冒险的提议,一些包可能是安全的,但其他包可能会开始做其他事情并利用您授予的 root 权限。 sudo 以超级用户身份运行后续命令
            • 一些像create-react-app这样的包需要root权限才能安装为全局包;否则,您将无法安装它。但是,reactjs 团队鼓励我们使用以下命令 npx create-react-app app_name 而不是安装全局包。
            【解决方案12】:

            我试图安装 react expo,除了 sudo 我必须添加 --unsafe-perm

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

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

            【讨论】:

            • @Furquan,非常感谢...尝试不同的解决方案后它对我有用。
            • @AzeTech,我很高兴它有帮助:D
            【解决方案13】:

            如果您在 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
            【解决方案14】:

            我用过sudo,但没有解决问题, 我已经通过更改 node_modules 文件夹权限解决了这个问题,

            sudo chmod -R 777 node_modules
            

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

            【讨论】:

              【解决方案15】:

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

              1. 使用curl 安装nvm(最新版本转到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了。

              【讨论】:

                【解决方案16】:

                对于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 &lt;package_name&gt; -g

                【讨论】:

                • 我不想用 sudo 安装节点脚本!
                【解决方案17】:

                帮助仅此:

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

                【讨论】:

                  【解决方案18】:

                  我能够在 mac 中使用以下内容解决此问题。

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

                  【讨论】:

                  • 警告:--unsafe-perm=true 存在安全风险,允许节点以 root 身份运行
                  【解决方案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
                  • 我之前有其他解决方案可以使用,但由于某种原因,这次需要所有这些解决方案才能使用文件夹。谢谢。 Mac v 10.15.2
                  • 在生产服务器上运行安全吗?
                  • 我在输出中:dest: '/usr/local/bin/.npm-uJtxIR1m'。所以我应该 chown /usr/local/bin 因为 .npm.. 似乎是一个动态文件/文件夹?
                  • 对我来说也是一样,除了这个决定之外没有任何效果。非常感谢!
                  【解决方案20】:

                  对于 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
                  【解决方案21】:

                  您可以通过 Node 版本管理器或 Node 安装程序安装 npm。在docs 中声明:

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

                  NPM 实际上是recommends using a Node Version Manager 以避免这些错误。

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

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

                  你需要做的就是

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

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

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

                  然后

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

                     nvm install node 
                    

                  (“node”是最新版本的别名)

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

                  【讨论】:

                  • 感谢亚当的回答!只是想知道稍后在构建/环境设置过程中可能会出现哪些复杂情况?
                  • 还要详细说明,fish 上的人,为了正常工作,nvm 需要一个 fish-wrapper github.com/FabioAntunes/fish-nvm
                  • 谢谢!我注意到有一个新的 NVM 次要版本,所以我猜现在命令应该是 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash。另外,我必须关闭并打开终端才能运行nvm install stable
                  • 这是我见过的最简单、最干净的答案。它避免弄乱文件夹权限或通过使用“sudo”来强制它。我认为这应该是公认的答案。谢谢!
                  • 当出现与 OP 相同的错误时,这解决了我关于 npm install -g mongodb-realm-cli 的问题。
                  【解决方案22】:

                  经过长时间的研究,我了解到 mac OS 不需要安装 angular cli 只需使用 sudo npm install -g @angular/cli 您的终端将提示密码输入您的密码它将继续安装 cli。它对我有用。

                  【讨论】:

                    【解决方案23】:

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

                    【讨论】:

                      【解决方案24】:

                      使用 'sudo npm install xyz' 就可以了。

                      【讨论】:

                        【解决方案25】:

                        这是由于 npm 无法在本地访问您的全局 node_modules 目录,正在运行

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

                        例如

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

                        修复了问题,现在您可以再次运行您运行的命令。

                        【讨论】:

                          【解决方案26】:

                          类似于 POsha 的回答,但这对我在 ubuntu 19 上有用

                          sudo npm i -g ngrok --unsafe-perm=true --allow-root
                          

                          从此链接

                          https://github.com/inconshreveable/ngrok/issues/429

                          【讨论】:

                            【解决方案27】:

                            如果你运行的是 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
                            

                            重新登录或来源以更新更改。

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

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

                            所以你不必chown文件夹权限

                            【讨论】:

                              【解决方案28】:

                              对于那些在使用上述解决方案后仍然无法解决问题的人。试试这个

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

                              这应该可以解决问题,干杯!

                              【讨论】:

                                【解决方案29】:

                                只需在 npm 命令前添加“sudo”即可。就是这样。

                                【讨论】:

                                • 请不要推荐这个,因为它是一种反模式并且可能会影响未来的安装
                                【解决方案30】:

                                如果在授予权限后仍然无法运行,请尝试运行以下命令:

                                mkdir ~/.npm-global
                                
                                npm config set prefix '~/.npm-global'
                                
                                export PATH=~/.npm-global/bin:$PATH
                                
                                source ~/.profile
                                

                                最后用这个命令测试

                                npm install -g jshint

                                这不适用于 Windows。

                                【讨论】:

                                • 如果你按照这个顺序,那么第三行是非永久性的(重启后将不起作用),第四行是完全无关的,什么也不做。请查看得分最高的答案以获得正确的解决方案。
                                猜你喜欢
                                • 2020-10-25
                                • 1970-01-01
                                • 2023-03-25
                                • 2021-12-22
                                • 2022-07-05
                                • 1970-01-01
                                • 1970-01-01
                                • 2020-09-05
                                • 2022-08-19
                                相关资源
                                最近更新 更多