[node.js] npm throws error without sudo

I just installed node and npm through the package on nodejs.org and whenever I try to search or install something with npm it throws the following error, unless I sudo the command. I have a feeling this is a permissions issue? I am already the admin.

npm ERR! Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR!  { [Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/Users/chietala/.npm/-/all/.cache.json' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

npm ERR! System Darwin 12.2.0
npm ERR! command "node" "/usr/local/bin/npm" "search" "bower"
npm ERR! cwd /Users/chietala
npm ERR! node -v v0.10.4
npm ERR! npm -v 1.2.18
npm ERR! path /Users/chietala/.npm/-/all/.cache.json
npm ERR! code EACCES
npm ERR! errno 3
npm ERR! stack Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/chietala/npm-debug.log
npm ERR! not ok code 0

This question is related to node.js unix permissions npm sudo

The answer is


TL;DR

always use sudo -i or sudo -H when running npm install to install global packages.


When you use npm, it downloads packages to your user home directory. When you run as sudo, npm installs files to the same directory, but now they are owned by root.

So this is what happens to absolutely every single person who has ever used npm:

  • install some local packages without issue using npm install foo
  • install global package using sudo install -g foo-cli without issue
  • attempt to install local package with npm install bar
  • get frustrated at the npm designers now that you have to go chmod a directory again

When you use the -i or -H option with sudo, your home directory will be root's home directory. Any global installs will cache packages to /root/.npm instead of root-owned files at /home/me/.npm.

Just always use sudo -i or sudo -H when running npm install to install global packages and your npm permissions problems will melt away.

For good.

http://hood.ie/blog/why-you-shouldnt-use-sudo-with-npm.html

-- q.v. the accepted answer for fixing an already messed up npm.


Also you will need the write permission in node_modules directory:

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

I encountered this when installing Recess (https://github.com/twitter/recess) to compile my CSS for Bootstrap 3.

When installing recess:

-npm install recess -g
  1. You need to unlock permissions in your home directory, like Noah says:

    sudo chown -R `whoami` ~/.npm
    
  2. You also need write permissions to the node_modules directory, like Xilo says, so if it still isn't working, try:

    sudo chown -R `whoami` /usr/local/lib/node_modules
    
  3. If you are still seeing errors, you may also need to correct /usr/local permissions:

    sudo chown -R `whoami` /usr/local
    

Please note that as indicated in this post /usr/local/ isn't actually a system dir if you are on a Mac, so, this answer is actually perfectly "safe" for Mac users. However, if you are on Linux, see Christopher Will's answer below for a multi-user friendly, system dir safe (but more complex) solution.


When you run npm install -g somepackage, you may get an EACCES error asking you to run the command again as root/Administrator. It's a permissions issue.

It's easy to fix, open your terminal (Applications > Utilities > Terminal)

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

** I strongly recommend you to not use the package management with sudo (sudo npm -g install something), because you can get some issues later **

Reference: http://foohack.com/2010/08/intro-to-npm/


Other answers are suggesting to change ownerships or permissions of system directories to a specific user. I highly disadvise from doing so, this can become very awkward and might mess up the entire system!

Here is a more generic and safer approach that supports multi-user as well.

Create a new group for node-users and add the required users to this group. Then set the ownership of node-dependant files/directories to this group.

# Create new group
sudo groupadd nodegrp 

# Add user to group (logname is a variable and gets replaced by the currently logged in user)
sudo usermod -a -G nodegrp `logname`

# Instant access to group without re-login
newgrp nodegrp

# Check group - nodegrp should be listed as well now
groups

# Change group of node_modules, node, npm to new group 
sudo chgrp -R nodegrp /usr/lib/node_modules/
sudo chgrp nodegrp /usr/bin/node
sudo chgrp nodegrp /usr/bin/npm

# (You may want to change a couple of more files (like grunt etc) in your /usr/bin/ directory.)

Now you can easily install your modules as user

npm install -g generator-angular

Some modules (grunt, bower, yo etc.) will still need to be installed as root. This is because they create symlinks in /user/bin/.

Edit

3 years later I'd recommend to use Node Version Manager. It safes you a lot of time and trouble.


I found that if you only sudo -s "it just starts up a shell with root permissions as a one step" and it really works for me. I don't know if it's a good practice or not.

I hope it helps.

Reference: https://apple.stackexchange.com/posts/14423/revisions


For Mac (adopted from Christoper Will's answer)

Mac OS X 10.9.4

  1. System Preference > Users & Groups > (unlock) > press + :

    New Account > "Group"
    Account Name : nodegrp

    After creating the group, tick the user to be included in this group

  2. sudo chgrp -R nodegrp /usr/local/lib/node_modules/
    sudo chgrp nodegrp /usr/bin/node
    sudo chgrp nodegrp /usr/bin/npm
    sudo chown -R $(whoami):nodegrp ~/.npm


ISSUE: You (the user) don't have the right set of permissions for the directory.

The instant way out is to run the npm install using sudo, but this may give you the same error, or improper installation.

AND changing directory ownership is not a good option, a temporary patch.


Solution/Suggestion: Change npm's Default Directory (from official docs)

Back-up your computer before moving forward.

(optional) In case you have a erroneous installation, first uninstall it:

npm uninstall <package-name>  # use sudo if you used it while installation
npm cache verify  # or, npm cache clean for npm version below 5.x.x 
  1. Make a directory for global installations:

    mkdir ~/.npm-global

  2. Configure npm to use the new directory path:

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

  3. Open or create a ~/.profile or ~/.bash_profile file and add this line:

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

  4. Back on the command line, update your system variables, or restart the terminal:

    source ~/.profile

  5. (optional) Test: Download a package globally without using sudo.

    npm install -g jshint


As if we need more answers here, but anyway..

Sindre Sorus has a guide Install npm packages globally without sudo on OS X and Linux outlining how to cleanly install without messing with permissions:

Here is a way to install packages globally for a given user.

  1. Create a directory for your global packages

    mkdir "${HOME}/.npm-packages"
    
  2. Reference this directory for future usage in your .bashrc/.zshrc:

    NPM_PACKAGES="${HOME}/.npm-packages"
    
  3. Indicate to npm where to store your globally installed package. In your $HOME/.npmrc file add:

    prefix=${HOME}/.npm-packages
    
  4. Ensure node will find them. Add the following to your .bashrc/.zshrc:

    NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
    
  5. Ensure you'll find installed binaries and man pages. Add the following to your .bashrc/.zshrc:

    PATH="$NPM_PACKAGES/bin:$PATH"
    # Unset manpath so we can inherit from /etc/manpath via the `manpath`
    # command
    unset MANPATH # delete if you already modified MANPATH elsewhere in your config
    MANPATH="$NPM_PACKAGES/share/man:$(manpath)"
    

Check out npm-g_nosudo for doing the above steps automagically

Checkout the source of this guide for the latest updates.


What to me seems like the best option is the one suggested in the npm documentation, which is to first check where global node_modules are installed by default by running npm config get prefix. If you get, like I do on Trusty, /usr, you might want to change it to a folder that you can safely own without messing things up the way I did.

To do that, choose or create a new folder in your system. You may want to have it in your home directory or, like me, under /usr/local for consistency because I'm also a Mac user (I prefer not to need to look into different places depending on the machine I happen to be in front of). Another good reason to do that is the fact that the /usr/local folder is probably already in your PATH (unless you like to mess around with your PATH) but chances are your newly-created folder isn't and you'd need to add it to the PATH yourself on your .bash-profile or .bashrc file.

Long story short, I changed the default location of the global modules with npm config set prefix '/usr/local', created the folder /usr/local/lib/node_modules (it will be used by npm) and changed permissions for the folders used by npm with the command:

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

Now you can globally install any module safely. Hope this helps!


For me, execute only

sudo chown -R $(whoami) ~/.npm

doesn't work. Then, I execute too

sudo chown -R $(whoami) /usr/lib/node_modules/
sudo chown -R $(whoami) /usr/bin/node
sudo chown -R $(whoami) /usr/bin/npm

And all works fine!


Another great fix here to configure NPM properly, run the following commands :

npm config set prefix '~/.npm_packages'
PATH=$PATH:$HOME/.npm_packages/bin; export PATH

In my case,it's because of the permission of ~/tmp.So I do:

sudo chown -R $USER ~/tmp

And it's OK!


sudo chown -R `whoami` /usr/local/lib

Permissions you used when installing Node will be required when doing things like writing in your npm directory (npm link, npm install -g, etc.).

You probably ran node installation with root permissions, that's why the global package installation is asking you to be root.


Solution 1: NVM

Don't hack with permissions, install node the right way.

On a development machine, you should not install and run node with root permissions, otherwise things like npm link, npm install -g will need the same permissions.

NVM (Node Version Manager) allows you to install Node without root permissions and also allows you to install many versions of Node to play easily with them.. Perfect for development.

  1. Uninstall Node (root permission will probably be required). This might help you.
  2. Then install NVM following instructions on this page.
  3. Install Node via NVM: nvm install node

Now npm link, npm install -g will no longer require you to be root.

Edit: See also https://docs.npmjs.com/getting-started/fixing-npm-permissions


Solution 2: Install with webi

webi fetches the official node package from the node release API. It does not require a package manager, does not require sudo or root access, and will not change any system permissions.

curl -s https://webinstall.dev/node | bash

Or, on Windows 10:

curl.exe -sA "MS" https://webinstall.dev/node | powershell

Like nvm, you can easily switch node versions:

webi node@v12

Unlike nvm (or Solution 3 below), the npm packages will be separate (you will need to re-install when you switch node versions).

Without changing npm configuration, you can install globally:

npm install -g prettier

This solution is essentially an automated version of other solutions that install to $HOME.


Solution 3: Install packages globally for a given user

Don't hack with permissions, install npm packages globally the right way.

If you are on OSX or Linux, you can create a user dedicated directory for your global package and setup npm and node to know how to find globally installed packages.

Check out this great article for step by step instructions on installing npm modules globally without sudo.

See also: npm's documentation on Fixing npm permissions.


This is how I solved the issue on Windows 8.1:

  • Go to your nodejs install (usually C:\Program Files\nodejs)
  • Right click node_modules folder and go to properties
  • Click the Security tab and advanced
  • At the top you will see "Owner: SYSTEM", click change
  • Enter the user you want permissions for and click Ok
  • Check the box at the bottom of the advanced settings "Replace all child object permission entries with inheritable permission entries from this object" and click ok
  • Do whatever npm install/update you need

John Papa points to the history and reasoning behind this issue and gives a solid fix:

John Papa's steps are to:

  1. Use brew to install node without npm
  2. Update your .bash_profile/.bashrc to let npm and node know where to install and find packages
  3. Use brew to update node and npm to update itself

Hope this helps the curious!


you could try this, works on ubuntu and mac

sudo chown -R $(whoami) /usr/local/lib/node_modules

This is the solution I utilized and worked. I tried utilizing whoami never worked.

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

then

sudo chown -R $USER /usr/local/bin/npm

then

sudo chown -R $USER /usr/local/bin/node


I had a similar problem at NPM modules won't install globally without sudo, the issue was that when i installed node i did it with sudo via chris/lea ppa repo.

My solution was to uninstall node and then install it this way:

Download latest stable node sources from nodejs.org #in my case node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz #uncompress sources

cd node-v0.10.20 #enter uncompressed folder

sudo chown $USER -R /usr/local

./configure --prefix=/usr/local && make && make install

PD: If you don't want to change ownership of the /usr/local folder, you can install it somewhere you already own. The problem of this approach is that you will have to bind the installation folder with the bash command line so that we can use the node command later on

mkdir ~/opt

./configure --prefix=~/opt && make && make install

echo 'export PATH=~/opt/bin:${PATH}' >> ~/.bashrc #or ~/.profile or ~/.bash_profile or ~/.zshenv depending on the current Operative System

With either of those approaches, you will be able to do the following without using sudo

npm install -g module_to_install


On Mac OS X, when installing with Homebrew's brew install npm, the installation path is /usr/local/share/npm/ with both bin/ and lib/node_modules/ subfolders.

Running this command to change to owner to your currently logged in user should fix it all up, and allow you to install global NPM packages without sudo.

sudo chown -R $USER ~/.npm /usr/local/share/npm/


I set my user account as the owner of the /usr/local directory, so that can just issue normal commands in there.

sudo chown -R $USER /usr/local

Reference: http://howtonode.org/introduction-to-npm


Changing the owner on "system-global" folders is a hack. On a fresh install, I would configure NPM to use an already writable location for "user-global" programs:

npm config set prefix ~/npm

Then make sure you add that folder to your path:

export PATH="$PATH:$HOME/npm/bin"

See @ErikAndreas' answer to NPM modules won't install globally without sudo and longer step-by-step guide by @sindresorhus with also sets $MANPATH.


@Yves M.'s answer was very similar to my solution. Here are the commands I used, which were slightly different from his.

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

Then query for the latest version:

nvm ls-remote

Then install the newest version:

nvm install YOUR_VERSION_HERE

example

nvm install v5.8.0

use below command while installing packages

 sudo npm install --unsafe-perm=true --allow-root

Watch OUT!!! Watch OUT!!! Watch OUT!!!

chown or chmod is NOT the solution, because of security-risk.

Instead do this, do:

First check, where npm point to, if you call:

npm config get prefix

If /usr is returned, you can do the following:

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

This create a npm-Directory in your Home-Directory and point npm to it.

To got this changes permanent, you have to add the export-command to your .bashrc:

echo -e "export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=\$PATH:~/.npm-global/bin" >> ~/.bashrc

The official documentation on how to fix npm install permissions with an EACCES error is located at https://docs.npmjs.com/getting-started/fixing-npm-permissions.

I encountered this problem after a fresh install of node using the .pkg installer on OSX. There are some great answers here, but I didn't see a link to npmjs.com yet.

Option 1: Change the permission to npm's default directory

  1. Find the path to npm's directory:

    npm config get prefix
    

For many systems, this will be /usr/local.

WARNING: If the displayed path is just /usr, switch to Option 2.

  1. Change the owner of npm's directories to the name of the current user (your username!):

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

    This changes the permissions of the sub-folders used by npm and some other tools (lib/node_modules, bin, and share).

Option 2: Change npm's default directory to another directory

There are times when you do not want to change ownership of the default directory that npm uses (i.e. /usr) as this could cause some problems, for example if you are sharing the system with other users.

Instead, you can configure npm to use a different directory altogether. In our case, this will be a hidden directory in our home folder.

  1. Make a directory for global installations:

    mkdir ~/.npm-global
    
  2. Configure npm to use the new directory path:

    npm config set prefix '~/.npm-global'
    
  3. Open or create a ~/.profile file and add this line:

    export PATH=~/.npm-global/bin:$PATH
    
  4. Back on the command line, update your system variables:

    source ~/.profile
    

All the above is not necessary.

The issue I was having was I was using the -g when I was running NPM. I couldn't work out how I wasn't getting a 'npm_module' folder created in my project.

The solution is to run 'NPM init' This creates a 'package.json' and the 'npm_module' folder where all subsequent modules will be loaded into. When running npm DO NOT use -g use -s to update your 'package.json' file.

Here is a good video explaining


Problem: You do not have permission to write to the directories that npm uses to store global packages and commands.

Solution: Allow permission for npm.

Open a terminal:

command + spacebar then type 'terminal'

Enter this command:

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
  • Note: this will require your password.

This solution allows permission to ONLY the directories needed, keeping the other directories nice and safe.


I Solve it by changing the owner from root to my user-name

sudo chown -R me:me /home/me/.config/configstore/

change me with your user-name and group .


Best solution would be this which is provided by npm documentation.


For Ubuntu suggested solution is Option#2

Brief steps:
Make a directory for global installations:
mkdir ~/.npm-global

Configure npm to use the new directory path:
npm config set prefix '~/.npm-global'
npm config get prefix can help you to verify if prefix was updated or not. The result would be <Your Home Directory>/.npm-global

Open or create a ~/.profile file and add this line:
export PATH=~/.npm-global/bin:$PATH

Back on the command line, update your system variables:
source ~/.profile

Instead of steps 2-4 you can also use the corresponding ENV variable (e.g. if you don't want to modify ~/.profile):

NPM_CONFIG_PREFIX=~/.npm-global


For Mac suggested solution is Option#3

On Mac OS you can avoid this problem altogether by using the Homebrew package manager

brew install node


Actually, I was also having the same problem. I was running Ubuntu. Mine problem arises because I'd lost my public key of the Ubuntu. Even updating my system was not happening. It was giving GPG error. In that case, you can regain your key by using this command:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <key in GPG error>

After that npm works fine!


In case sudo chown -R $(whoami) ~/.npm didn't work for you, or you need a non terminal command solution.

The issue is that your user account does not have write permission to node_modules folder, so you can do the following

  1. Open finder and press cmd + shift + g this will open go to folder with url

  2. Write the following path /usr/local/lib/node_modules and press go

  3. Right click on node_modules folder and choose Get Info

  4. Scroll down to sharing & permissions section

  5. Unlock to be able to make changes.

  6. Press + and add your user account

  7. Make sure that you choose Read & Write in privilege drop down

Now you should be able to install packages without sudo and permission issues should be solved


I ran into this issue, and while it's true that ~/.npm should be owned by your user, npm was not installing the modules there.

What actually solved my issue is this command:

npm config set prefix ~/.npm

It will make sure that all your global installation will go under this prefix. And it's important that your user owns this directory.


I like to use ubuntu groups to achieve this instead of changing owner. Its quite simple.

  1. First install nodejs and npm using apt-get

    sudo apt-get update && sudo apt-get install nodejs npm

  2. Figure out who is logged in i.e username, run following command to see it in terminal

    whoami

  3. You can see the list of groups you are assigned by using a very simple command, normally the first group is your username itself

    groups

  4. Run following to allow access to logged in user

    sudo chmod 777 -R /usr/local && sudo chgrp $(whoami) -R /usr/local

  5. Update npm and nodejs

    npm install -g npm

You are allset, your user can run npm commands without sudo

You can also refer to this link https://askubuntu.com/a/1115373/687804


Examples related to node.js

Hide Signs that Meteor.js was Used Querying date field in MongoDB with Mongoose SyntaxError: Cannot use import statement outside a module Server Discovery And Monitoring engine is deprecated How to fix ReferenceError: primordials is not defined in node UnhandledPromiseRejectionWarning: This error originated either by throwing inside of an async function without a catch block dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.62.dylib error running php after installing node with brew on Mac internal/modules/cjs/loader.js:582 throw err DeprecationWarning: Buffer() is deprecated due to security and usability issues when I move my script to another server Please run `npm cache clean`

Examples related to unix

Docker CE on RHEL - Requires: container-selinux >= 2.9 What does `set -x` do? How to find files modified in last x minutes (find -mmin does not work as expected) sudo: npm: command not found How to sort a file in-place How to read a .properties file which contains keys that have a period character using Shell script gpg decryption fails with no secret key error Loop through a comma-separated shell variable Best way to find os name and version in Unix/Linux platform Resource u'tokenizers/punkt/english.pickle' not found

Examples related to permissions

On npm install: Unhandled rejection Error: EACCES: permission denied Warnings Your Apk Is Using Permissions That Require A Privacy Policy: (android.permission.READ_PHONE_STATE) ActivityCompat.requestPermissions not showing dialog box PostgreSQL: role is not permitted to log in Android 6.0 multiple permissions Storage permission error in Marshmallow Android M Permissions: onRequestPermissionsResult() not being called pip install failing with: OSError: [Errno 13] Permission denied on directory SSH Key: “Permissions 0644 for 'id_rsa.pub' are too open.” on mac changing the owner of folder in linux

Examples related to npm

What does 'x packages are looking for funding' mean when running `npm install`? error: This is probably not a problem with npm. There is likely additional logging output above Module not found: Error: Can't resolve 'core-js/es6' Browserslist: caniuse-lite is outdated. Please run next command `npm update caniuse-lite browserslist` ERROR in The Angular Compiler requires TypeScript >=3.1.1 and <3.2.0 but 3.2.1 was found instead DeprecationWarning: Buffer() is deprecated due to security and usability issues when I move my script to another server Please run `npm cache clean` What exactly is the 'react-scripts start' command? On npm install: Unhandled rejection Error: EACCES: permission denied Difference between npx and npm?

Examples related to sudo

Composer: file_put_contents(./composer.json): failed to open stream: Permission denied How to run SUDO command in WinSCP to transfer files from Windows to linux How to install Intellij IDEA on Ubuntu? pip install: Please check the permissions and owner of that directory How to use sudo inside a docker container? How to fix 'sudo: no tty present and no askpass program specified' error? npm install errors with Error: ENOENT, chmod npm throws error without sudo Is it acceptable and safe to run pip install under sudo? Command not found when using sudo