The error message Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
is a common hurdle encountered when working with Node Package Manager (npm).
This issue typically arises when npm attempts to write to system-protected directories, most often during the global installation of packages. This article delves into the underlying causes of this permission conflict and outlines several practical strategies to address it effectively.
Why This Permission Error Occurs
The core of the EACCES
error lies in file system permissions. Standard user accounts generally lack write privileges for system-level directories like /usr/local/lib/node_modules
or /usr/local/bin
. These directories are often owned by the root
user (or an administrator equivalent) to maintain system integrity and security.
When npm is instructed to install a package globally (e.g., using the -g
flag), it attempts to place the package’s files into these system-wide locations. If the user executing the npm command does not have the requisite permissions for the target directory, the operating system denies access, resulting in the EACCES
error.
Below is a typical representation of the error:
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.
Strategies for Resolution
Several methods can resolve this permission issue. They range from altering directory ownership to reconfiguring npm’s installation paths or using version managers. It’s important to choose a method that aligns with your system administration comfort level and security considerations.
Read: How to create a Sudo user on Ubuntu
Method 1: Adjusting Directory Ownership (`chown`)
This approach involves changing the owner of the problematic directory (and its contents) to your current user account. This grants your user the necessary write permissions.
- Identify the current owner:You can check who owns the
node_modules
directory using:ls -la /usr/local/lib/node_modules
Or, to see the permissions of the
node_modules
directory itself within/usr/local/lib/
:ls -la /usr/local/lib/ | grep node_modules
Typically, you’ll find it’s owned by `root`.
- Determine your current username:If you’re unsure of your username, use one of these commands:
id -un
or
whoami
- Change the ownership:Use the
chown
command withsudo
. Replace#YOUR_USERNAME
with the output from the previous step, or use the$USER
environment variable which typically holds your current username.sudo chown -R $USER /usr/local/lib/node_modules
Alternatively, if you need to specify a group or encounter issues with group names containing special characters, you might use:
sudo chown -R #YOUR_USERNAME: /usr/local/lib/node_modules
(Note the colon after the username, which sets the primary group of the user as the group owner).
In some cases, permissions issues might extend to parent directories or related system paths used by npm for global binaries. If the problem persists, you might need to adjust ownership for other directories, such as:
sudo chown -R $USER /usr/local/lib/
sudo chown -R $USER /usr/local/bin/
sudo chown -R $USER /usr/local/share/
Or, more comprehensively for common npm global paths:
sudo chown -R $(whoami) /usr/local/{lib/node_modules,bin,share}
Caution: While effective, changing ownership of broad system directories like /usr/local/lib
entirely can have unintended security implications or interfere with other system software. It’s generally safer to target the specific node_modules
directory or use alternative methods discussed below.
Decision Flowchart
To find the exact global `node_modules` path if it differs, use: `npm root -g`.
Read: Linux directories explained
Method 2: Configuring a User-Specific Global npm Directory
A safer alternative to modifying system directory permissions is to configure npm to use a directory within your home folder for global package installations. This directory will be owned by your user by default.
- Create a directory for global npm packages:
mkdir ~/.npm-global
- Configure npm to use the new directory path:
npm config set prefix '~/.npm-global'
- Add the new directory’s
bin
subfolder to your system’sPATH
:Open your shell configuration file (e.g.,~/.profile
,~/.bashrc
,~/.zshrc
, or~/.bash_profile
depending on your shell and OS). Add the following line:export PATH=~/.npm-global/bin:$PATH
- Update your system variables:Apply the changes by sourcing your shell configuration file (replace
~/.profile
with the actual file you edited):source ~/.profile
Alternatively, close and reopen your terminal session.
This method avoids permission errors by keeping global packages within your user’s writable space. It is generally considered a cleaner and safer approach.
Note: This approach might conflict if you are also using a Node Version Manager (NVM), as NVM manages its own paths and might warn about a custom `prefix` setting in `~/.npmrc`.
Method 3: Utilizing a Node Version Manager (NVM)
Node Version Manager (NVM) is a widely recommended tool for managing multiple Node.js versions. A significant benefit of using NVM is that it installs Node.js and npm in a way that naturally avoids permission errors for global packages, as it typically manages installations within your user’s home directory.
- Install NVM:Execute the NVM installation script. Refer to the official NVM repository for the latest version number to use in place of
#LATEST_NVM_VERSION
.curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/#LATEST_NVM_VERSION/install.sh | bash
The script may provide instructions to add lines to your shell profile (e.g.,
~/.bashrc
,~/.zshrc
). Ensure these are added and your shell profile is sourced, or restart your terminal. - Install Node.js (and npm) via NVM:Install the latest stable version of Node.js:
nvm install node
Or install a specific or LTS version (e.g.,
nvm install --lts
).
Once Node.js is installed via NVM, you should be able to install global npm packages without sudo
and without encountering EACCES
errors related to system directories.
Method 4: Employing `sudo` for npm Commands (Use with Caution)
A straightforward, but generally discouraged, way to bypass permission errors is to execute the npm command with superuser privileges using sudo
:
sudo npm install -g #your-package-name
This command runs npm as the root
user, which has the necessary permissions to write to system directories.
Security Warning: Using sudo
with npm, especially for installing packages from untrusted sources, can pose significant security risks. Package installation scripts will run with root privileges, potentially allowing malicious code to compromise your system. This approach can also lead to inconsistencies in permissions for npm’s cache or other globally installed packages, potentially causing further issues down the line. It is generally recommended to avoid this method for routine package management.
Method 5: Using `sudo` with `–unsafe-perm` (Advanced & Risky)
In some specific scenarios, particularly with packages that have complex post-install scripts requiring elevated permissions to modify system files or configurations, `sudo` alone might not suffice, or the package scripts might drop privileges. The `–unsafe-perm` flag can be used in conjunction with `sudo` to allow these scripts to run with root privileges:
sudo npm install -g #your-package-name --unsafe-perm=true
Sometimes, `–allow-root` is also used in similar contexts:
sudo npm install -g #your-package-name --unsafe-perm=true --allow-root
Strong Security Warning: This option significantly increases security risks, as it allows package scripts to execute with full root access. Only use this method if you fully trust the package and understand the implications. It should be considered a last resort.
Method 6: Prefer Local Installations or `npx`
Often, global installation isn’t strictly necessary. For packages that are dependencies of a specific project, local installation is the standard:
npm install #your-package-name --save
Or for development dependencies:
npm install #your-package-name --save-dev
These packages are installed in the project’s local node_modules
directory and do not require special permissions.
For command-line interface (CLI) tools that you might otherwise install globally, npx
offers a convenient alternative. npx
allows you to execute npm packages without installing them globally (it downloads them temporarily if needed):
npx #command-name #options
For example, instead of globally installing create-react-app
, you can run:
npx create-react-app my-app
This approach avoids global permission issues entirely for many common use cases of CLI tools.
Verification and Testing
After applying one of the solutions (excluding methods that inherently use `sudo`), you can test if the issue is resolved by attempting to install a lightweight global package without `sudo`:
npm install -g jshint
If the command completes without any EACCES
errors, the chosen solution has likely worked. You can further verify by trying to use the globally installed package.
Conclusion
The EACCES: permission denied
error when npm accesses /usr/local/lib/node_modules
is a frequent challenge stemming from file system permissions. While directly changing directory ownership or using sudo
can provide quick fixes, these methods come with caveats, particularly regarding system security and stability.
For a more robust and safer long-term solution, configuring npm to use a user-specific directory for global packages or, preferably, employing a Node Version Manager like NVM are highly recommended. These approaches align better with security best practices and offer greater flexibility in managing Node.js environments. Opting for local installations or using `npx` for CLI tools can also circumvent the need for global installations and their associated permission complexities altogether.
If you like the content, we would appreciate your support by buying us a coffee. Thank you so much for your visit and support.