Błąd: EACCES: odmowa dostępu, reagowanie na dostęp „/ usr / local / lib / node_modules”


298

Co może być przyczyną błędu 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
Zobacz oficjalny przewodnik NPM na temat rozwiązania tego problemu: docs.npmjs.com/…
Dzhuneyt

Odpowiedzi:


488

zmień swoje uprawnienia do plików .. w ten sposób

najpierw sprawdź, kto jest właścicielem katalogu

ls -la /usr/local/lib/node_modules

odmawia dostępu, ponieważ folder node_module jest własnością root

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

więc należy to zmienić, zmieniając root na użytkownika, ale najpierw uruchom poniższe polecenie, aby sprawdzić bieżącego użytkownika. Jak uzyskać nazwę aktywnego użytkownika za pomocą wiersza polecenia w OS X?

id -un

LUB

whoami

następnie zmień właściciela

sudo chown -R [owner]:[owner] /usr/local/lib/node_modules

LUB

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

LUB

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

3
Zdarzały się przypadki, gdy dodawanie sudo w poleceniu również nie działało. To działało dla mnie i należy przyjąć odpowiedź.
Niroj Shr,

1
Moja firma korzysta z jednokrotnego logowania Microsoft Active Directory. Więc nazwa grupy zawiera ukośniki i spację. Co sprawia, że ​​jest to trochę trudniejsze. Poleceniem, którego użyłem, było sudo chown -R myuser:Company\\Domain\ Users /usr/local/lib/node_modules. Aby poprawnie wymienić nazwę grupy, którą zrobiłem id -gn myuser.
Patrick

44
Było to pomocne, ale kiedy uruchomiłem polecenie zmiany właściciela, dostałem illegal group name. Więc zmieniłem polecenie na sudo chown -R ownerName: /usr/local/lib/node_modulesi zadziałało.
Midori

4
Chociaż to właściwa odpowiedź, napotkałem ten problem wiele razy i lepszym rozwiązaniem jest użycie nvm. w ten sposób nie będziesz musiał zmieniać właściciela plików za pomocą chown. github.com/nvm-sh/nvm
Roee

1
Zamiast zmieniać uprawnienia, w dokumentach zaleca się zainstalowanie npm z nvm. Zobacz stackoverflow.com/a/59575266/2311074
Adam

106

Aby zminimalizować ryzyko błędów uprawnień, możesz skonfigurować npm do korzystania z innego katalogu. W tym przykładzie utworzysz i użyjesz ukrytego katalogu w swoim katalogu domowym.

Zrób kopię zapasową komputera. W wierszu komend w katalogu domowym utwórz katalog dla instalacji globalnych:

mkdir ~/.npm-global

Skonfiguruj npm, aby używał nowej ścieżki do katalogu:

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

W preferowanym edytorze tekstu otwórz lub utwórz plik

~/.profile

plik i dodaj ten wiersz:

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

W wierszu polecenia zaktualizuj zmienne systemowe:

source ~/.profile

Aby przetestować nową konfigurację, zainstaluj pakiet globalnie bez użycia sudo


18
To moim zdaniem najmniej destrukcyjna opcja. Jest to również zalecane na stronie internetowej npm .
17xande

Alternatywnie, jeśli nie chcesz tego robić npm config set prefix(szczególnie, jeśli piszesz instalator inny niż root), możesz zastąpić PREFIXenv var lub podać --prefixopcję, z których oba są równoważne npm config set prefix. (nie jestem pewien, które to przesłania)
SOFe

To działało idealnie dla mnie. Moim zdaniem odpowiedź ta stwarza najmniej miejsca na niszczycielskie błędy i jest bardzo łatwa do zrozumienia i wdrożenia.
clockelliptic

1
Właśnie tego szukał! Dzięki.
djangodude

Jest to faktycznie zalecane i najlepsze rozwiązanie w dłuższej perspektywie.
Al-Mothafar,

49

Wszystko, co musisz zrobić, to dodać USER do właściciela / local / lib

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

7
Jeśli przyszli czytelnicy nie rozumieją uprawnień, zapoznaj się z oficjalną dokumentacją dokumentacji NPM i odpowiednio napraw problem. docs.npmjs.com/… . W szczególności przyszli czytelnicy powinni prawdopodobnie ponownie zainstalować npm za pomocą menedżera wersji węzłów (zalecane)
ordonezalex

1
To jest całkiem proste. Oznacza to również, że nigdy więcej nie musisz się martwić o nic w lib; jesteś właścicielem / usr / local / lib.
Obinna Nnenanya

4
To wcale nie jest dobre rozwiązanie. Uruchamiając powyższe chown, istnieje wysokie ryzyko zniszczenia struktury uprawnień całego systemu plików.
Lars,

3
To polecenie zrujnowało wszystkie moje uprawnienia. Potrzebujesz ponownie odzyskać wszystkie rzeczy.
Azam Alvi

4
Mówiąc dokładniej, nie oznacza to dodania właściciela. To zmienia się właściciel, który jest o wiele bardziej destrukcyjny niż tylko dodanie i jest prawie tak destrukcyjne jak sudo chmod -R 777 /.
SOFe

29

spróbuj dołączyć sudo przed jakimkolwiek poleceniem, które próbujesz.

w ten sposób: instalacja sudo npm

Używanie sudo z poleceniem w systemie Linux / UNIX ogólnie podnosi twoje uprawnienia do poziomów administratora. W systemie Windows konto administratora jest zwykle nazywane „Administratorem”. W systemie Linux / Unix konto administratora jest zwykle nazywane „root”.

Użytkownik root ma uprawnienia do uzyskiwania dostępu, modyfikowania lub usuwania prawie dowolnego pliku na komputerze. Zwykłe konta użytkowników mogą uzyskiwać dostęp, modyfikować lub usuwać wiele mniej plików. Ograniczenia dotyczące zwykłego konta chronią komputer przed nieautoryzowanymi lub szkodliwymi programami lub użytkownikami. Niektóre procesy wymagają wykonania działań na plikach lub folderach, do których normalnie nie masz uprawnień dostępu. Jednym z tych działań jest instalacja programu, do którego każdy może uzyskać dostęp.

W twoim przypadku uruchomienie polecenia instalacyjnego z sudo daje uprawnienia administratora i pozwala modyfikować pliki, których normalny użytkownik nie ma uprawnień do modyfikowania.


57
unikaj używania sudo podczas instalowania pakietów npm. Im głębiej idziesz taką ścieżką, tym trudniej będzie ją później naprawić. Po prostu zmień uprawnienia do folderu npm, jak wskazano w innej odpowiedzi i żyj lepiej.
Lukas Liesis

2
To może działać, ale z czasem spowoduje ciągłe problemy. Unikaj tego, jeśli nie chcesz otrzymywać wszelkiego rodzaju błędów odmowy uprawnień. Jak odmowa dostępu do folderu pamięci podręcznej npm, odmowa instalacji i tak dalej.
Lukas Liesis

1
Ta odpowiedź powinna zostać usunięta, ponieważ używanie sudo przed instalacją pakietów stanowi bardzo niebezpieczny precedens, jeśli użytkownik nie rozumie uprawnień. Proszę odnieść się do pierwszej odpowiedzi, w której raz zmienia się własność lokalizacji węzła podstawowego.
SeaWarrior404

19

Próbowałem rozwiązania odpowiedzi udzielonej przez @okanda, ale nie zadziałało to dla mnie.

Jednak działało idealnie, gdy zrobiłem to dla kilku folderów, takich jak wspomniane w tym wątku: 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/

Dzięki, ta odpowiedź pomogła mi. Ubuntu 18.04.3
bakhti_UZB

Miałem wcześniej inne rozwiązania, ale z jakiegoś powodu tym razem zajęło to wszystko do folderów roboczych. Dzięki. Mac v 10.15.2
Amir5000

1
Czy uruchomienie serwera produkcyjnego jest bezpieczne?
Cheezey,

16

Podczas instalowania globalnych pakietów w Ubuntu , potrzebujesz specjalnych uprawnień do zapisu podczas pisania do usr/binfolderu. To ze względów bezpieczeństwa. Za każdym razem, gdy instalujesz pakiet globalny, użyj:

sudo npm install -g [package-name]

W konkretnym przypadku będzie to:

sudo npm install -g typescript

14

Wygląda na to, że masz problemy z uprawnieniami. Jeśli instalujesz, npm-packagesto może EACCESwystąpić błąd podczas próby zainstalowania pakietu globalnie. Oznacza to, że nie masz uprawnień do zapisu w katalogach npmużywanych do przechowywania globalnych pakietów i poleceń.

Spróbuj uruchomić komendy: sudo chmod u+x -R 775 ~/.npma sudo chown $USER -R ~/.npmczy można po prostu uruchomić dowolną npmkomendę z sudo, że powinien dostać rozwiązać problem.

Jeśli instalujesz npm-packagelokalnie, powinieneś być w lokalnym katalogu projektu i możesz spróbować uruchomić sudo npm install <pkg-name>polecenie, aby zainstalować wymagany pakiet. celem użycia sudojest zmiana uprawnień właściciela, abyś mógł upoważnić bieżącego użytkownika do uruchamiania npmpoleceń.

Polecam zajrzeć na https://docs.npmjs.com/getting-started/fixing-npm-permissions


10

Próbowałem zainstalować expo reagujące i oprócz sudo musiałem dodać --unsafe-perm

lubię to. To rozwiązuje mój problem

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

@ Furquan, dziękuję bardzo ... To zadziałało dla mnie po wypróbowaniu różnych rozwiązań.
AzeTech

@AzeTech, cieszę się, że to pomogło: D
Furquan,

9

Jeśli masz do czynienia z tym problemem na komputerze Mac. Wykonaj następujące kroki

Najpierw sprawdź, kto jest właścicielem tego pliku, używając poniższego polecenia

ls -la /usr/local/lib/node_modules

znajdziesz plik jak poniżej. Jeden z nich jest poniżej

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

czy zauważyłeś, że powyższy plik jest własnością root, aby dokonać zmian w środku, musisz zmienić właściciela ścieżki statku.

możesz użyć polecenia sprawdź, kto jest bieżącym użytkownikiem za pomocą tego polecenia

id -un (in my case user is yamsol)

a następnie możesz to zmienić, wywołując to polecenie (wystarczy zastąpić swoją nazwę użytkownika nazwą właścicielName)

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

w moim przypadku, jak wiadomo, użytkownik to „yamsol”, wywołam to polecenie w ten sposób

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

Otóż ​​to.



8

Możesz zainstalować npm za pomocą menedżera wersji Node lub instalatora Node. W dokumentach stwierdzono:

Nie zalecamy używania instalatora węzła, ponieważ proces instalacji węzła instaluje npm w katalogu z lokalnymi uprawnieniami i może powodować błędy uprawnień podczas globalnego uruchamiania pakietów npm.

Ponieważ wystąpił błąd uprawnień , prawdopodobnie zainstalowałeś npm za pomocą instalatora węzła, a teraz musisz go ponownie zainstalować za pomocą nvm (menedżera wersji węzła).

Na szczęście jest to bardzo proste. Nie musisz nawet usuwać bieżącej wersji npm lub Node.js.

Wszystko, co musisz zrobić, to

  1. Zainstaluj NVM. W przypadku węzła OSX lub Linux należy użyć:

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

    Spowoduje to utworzenie folderu nvm w katalogu domowym.

Następnie

  1. Zainstaluj npm i node.js przez nvm. Aby to zrobić, wystarczy zadzwonić

    nvm install stable

Teraz można zainstalować pakiet globalnie bez użycia sudolub zmiany właściciela node_modulesw usrfolderze.


dzięki za odpowiedź Adam! Zastanawiam się tylko, jakie mogą być ewentualne komplikacje w procesie kompilacji / środowiska?
吖 奇 说 - 何魏奇 Archy Will He

także, aby opracować, dla ludzi dalej fish, w celu prawidłowego działania nvm potrzebuje opakowania rybnego github.com/FabioAntunes/fish-nvm
吖 奇 说 - 何魏奇 Archy Will He

@ 吖 奇 说 ARCHYSHUō Nigdy nie słyszałem o żadnych komplikacjach podczas instalowania węzła z nvm. A ponieważ jest to zalecane z oficjalnych dokumentów, wydaje mi się, że to najlepsza droga :)
Adam

7

Użyj tego polecenia, aby zainstalować npm jako użytkownik sudo:

sudo npm install -g create-react-app 

zamiast npm zainstaluj -g stwórz-zareaguj -p pp.


cytując @ Lukasa - używając sudo podczas instalowania pakietów npm. Im głębiej idziesz taką ścieżką, tym trudniej będzie ją później naprawić. Po prostu zmień uprawnienia do folderu npm, jak wskazano w innej odpowiedzi i żyj lepiej.
सत्यमेव जयते

6

Byłem w stanie rozwiązać problem, korzystając z następujących elementów w systemie Mac.

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

6

Dla użytkowników NVM

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

i

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

zamień v8.9.1na używaną wersję węzła.


To mi nie działa! Nadal pojawia się błąd: npm ERR! Błąd: EACCES: odmowa dostępu, zmiana nazwy /home/samuel/.nvm/versions/node/v8.10.0/lib/node_modules/.staging/npm-90fab7c7/node_modules/columnify/node_modules/wcwidth/node_modules/defaults coś z /.staging .. ten folder nie istnieje po próbie instalacji. Czy możesz mi z tym pomóc?
Samuel

@Samuel czy uruchomiłeś to polecenie? sudo chown -R $USER home/samuel/.nvm/versions/node/v8.10.0/lib/node_modules
bereket gebredingle

5

Wygląda na to, że próbowałeś zainstalować pakiet npm globalnie, a nie lokalnie, jak to man npm installopisuje:

Argument -g lub --global spowoduje, że npm zainstaluje pakiet globalnie, a nie lokalnie.

Zasadniczo, gdy konfigurujesz projekt npm (wśród wielu innych, które możesz mieć), nie jest dobrym pomysłem instalowanie pakietów w modułach globalnych Node.js (/ usr / local / lib / node_modules), jako dziennik debugowania zasugerował.

Zamiast używać -g, użyj --save, który automatycznie zapisze pakiet jako zależność dla twojego package.jsonpliku:

Lubię to:

$ 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"
  }
}

Ale jak wspomniano w innych odpowiedziach, jeśli zamierzasz użyć -g, musisz użyć sudo( jeśli użytkownik ma uprawnienia sudo: patrz / etc / sudoers ) podczas wykonywania npm install express-generator -g, ale w rzeczywistości nie jest to dobry pomysł, ponieważ może to powodować problemy z uprawnieniami.

OGŁOSZENIE

Istnieją instrukcje dotyczące instalowania express-generatorz -gopcją, aby skrypt był express-cli.jsdostępny w ścieżce systemowej, ale możesz również użyć lokalnie zainstalowanego skryptu, który znajduje się w node_modulesprojekcie ifm np:

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

Jeśli pojawi się komunikat taki jak / usr / bin / env: 'node': nie pojawia się taki plik lub katalog , zainstaluj nodejs-legacy(Debian / Ubuntu)

IMHO, używanie -g(także używanie sudo) jest jak hic sunt dracones , jeśli nie jesteś pewien konsekwencji.

W celu uzyskania dalszych informacji:


4

Stało się tak w wyniku npmniemożności uzyskania dostępu do node_moduleslokalnego katalogu globalnego podczas działania

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

na przykład

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

naprawia problem, teraz możesz uruchomić polecenie, które uruchomiłeś ponownie.


3

Po prostu możesz zmienić właściciela lub po prostu użyć sudo, zanim wykonasz takie polecenie

sudo chown -R [owner]:[owner] /usr/local/lib/node_modules( zmiana właściciela )

lub

sudo npm install -g json-server

Otóż ​​to.


3

Dla linux / ubuntu, jeśli polecenie

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

Poprawka: instalacja z uprawnieniami administratora

sudo npm install <package_name> -g


3

Aby zainstalować program React, potrzebujesz uprawnień poziomów administratora. W systemie Linux / Unix konto administratora jest zwykle nazywane „root”.

Aby uzyskać uprawnienia administratora, uruchom na terminalu następujące polecenie:

sudo -i

a następnie po prostu uruchom polecenie, aby zainstalować React:

npm install -g create-react-app

Jednak zespół reagjs zachęca nas do korzystania z następującego polecenia zamiast instalowania pakietu globalnego.

npx create-react-app app_name

1
Korzystanie z sudo jest ryzykowną propozycją, niektóre pakiety mogą być bezpieczne, ale inne mogą rozpocząć coś innego i skorzystać z nadanych uprawnień roota. sudo uruchamia kolejne polecenia jako superużytkownik
rustyDev,

Niektóre pakiety, takie jak create-react-appuprawnienia roota, muszą być instalowane jako pakiety globalne; w przeciwnym razie nie będziesz mógł go zainstalować. Jednak zespół reagjs zachęca nas do korzystania z następującego polecenia npx create-react-app app_namezamiast instalowania pakietu globalnego.
Fatema T. Zuhora,



2

Po długich badaniach zrozumiałem, że nic nie jest wymagane do zainstalowania kątowego cli w systemie Mac OS. Wystarczy użyć sudo npm install -g @angular/cliterminala, aby wprowadzić hasło, a następnie kontynuować instalację cli. To zadziałało dla mnie.



2

Jeśli używasz Linuksa (tj .: Arch)

# npm -g install packageName

Domyślnie to polecenie instaluje pakiet w katalogu / usr / lib / node_modules / npm i wymaga do tego uprawnień administratora.

Aby zezwolić na instalacje dla całego użytkownika

Aby zezwolić na instalowanie pakietów globalnych dla bieżącego użytkownika, ustaw npm_config_prefixzmienną środowiskową. Jest to używane zarówno przez npm, jak i przędzę.

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

Zaloguj się ponownie lub podaj źródło, aby zaktualizować zmiany.

Możesz również określić --prefixparametr dla npm install. Nie jest to jednak zalecane, ponieważ należy go dodawać przy każdej instalacji pakietu globalnego.

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

Więc nie musisz zmieniać uprawnień do folderów


1

Mogłem pozbyć się tego problemu, instalując nvm, a następnie ustawiając węzeł na najnowszą wersję.

  1. Zainstaluj nvmza pomocą curl(najnowsza wersja przejdź do nvm.sh )
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
  1. Wyświetl dostępne wersje węzłów
nvm ls

v10.12.0
domyślnie -> v10.12 (-> v10.12.0)
węzeł -> stabilny (-> v10.12.0) (domyślnie)
stabilny -> 10.12 (-> v10.12.0)

  1. Wybierz wersję węzła, której chcesz użyć
nvm use v10.12

nvm nie jest kompatybilny z opcją „prefiks” konfiguracji npm: obecnie ustawiony na „”

  1. Uruchom to, aby wyłączyć opcję:
nvm use --delete-prefix v10.12.0

Po wykonaniu powyższych poleceń będziesz mógł zainstalować React / Angular w Ubuntu.




0

Użyłem sudo, ale to nie rozwiązało problemu, naprawiłem problem, zmieniając uprawnienia do folderu node_modules,

sudo chmod -R 777 node_modules

Jeśli chcesz, możesz zastąpić 777 innym kodem, jeśli nie ustawisz uprawnień dla wszystkich użytkowników / grup.


0

Dla tych z Was, którzy nadal nie mogą rozwiązać problemu po użyciu wyżej wymienionych rozwiązań. Spróbuj tego

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

To powinno wystarczyć, na zdrowie!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.