Non è possibile utilizzare NVM da root (o sudo)


104

Ho detto che la mia applicazione utilizza una versione diversa di NodeJS quando viene eseguita da sudo.

$ node -v
v0.10.23
$ sudo node -v
v0.11.8-pre

Questa v0.11.8-pre mi ha causato alcuni problemi, quindi sicuramente non voglio usarla, ma non posso cambiarla per root.

$ sudo nvm use v0.10.23
sudo: nvm: command not found

Ho provato a installare nvm da utente root, ma ho ricevuto l'errore "NVM già installato", ma ancora nvm non trovato durante l'esecuzione da sudo. Qual è il mio problema?


3
Prova sudo -s quindi installa nvm.
Giochi Brainiac

@GamesBrainiac Scusa, ma ho scritto che ho provato a installarlo da root
Vitalii Korsakov

prova a eliminare /root/.nvm/ e reinstallare nvm da zero
Antonio E.

non c'è /root/.nvm. Ho installato nvm da sudo ed è stato installato in homedir dell'utente regolare
Vitalii Korsakov

4
Questo risolve tutti i miei problemi dato che avevi github.com/xtuple/nvm
Yoo Matsuo

Risposte:


220

Il seguente elenco di comandi (fonte: digitalocean ) sembra risolvere il problema

n=$(which node); \
n=${n%/bin/node}; \
chmod -R 755 $n/bin/*; \
sudo cp -r $n/{bin,lib,share} /usr/local

Il comando sopra è un po 'complicato, ma tutto ciò che sta facendo è copiare qualsiasi versione del nodo che hai attivo tramite nvm nella /usr/local/directory (dove i file globali installati dall'utente dovrebbero risiedere su un VPS di Linux) e impostare i permessi in modo che tutti gli utenti possano accedervi .

Spero che questo ti aiuti!


7
Grazie, mi ha aiutato.
Vishal Kumar Verma

7
Grazie! Questo mi ha fatto risparmiare molto tempo
Quinton Pike

4
Perfetto! Grazie mille.
Jean-Baptiste Louazel

2
Eccezionale! La scorsa notte ho rovinato il mio intero sistema RasPi 3 cambiando disperatamente le autorizzazioni per npm ovunque, oggi ho passato 3 ore alla ricerca della migliore soluzione per installare node / npm a livello globale senza la necessità di sudo per ogni chiamata npm. La tua soluzione è andata bene con questo post losant.com/blog/how-to-install-nodejs-on-raspberry-pi
bosch

3
Sembra un'ottima opzione, ma continuo a ricevere questi errori:chmod: cannot operate on dangling symlink ‘/home/ec2-user/.nvm/versions/node/v7.1.0/bin/node-debug’ chmod: cannot operate on dangling symlink ‘/home/ec2-user/.nvm/versions/node/v7.1.0/bin/node-inspector’
trex005

129

La mia soluzione è creare collegamenti simbolici dalle versioni di nodee npmsto usando per /usr/local/bin:

sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/node" "/usr/local/bin/node"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npm" "/usr/local/bin/npm"

Questo rende npme nodedisponibile a tutti gli utenti.


1
Ottima soluzione. aggiungi semplicemente "alla fine della seconda riga ... (non ho potuto modificarlo da solo per qualche motivo)
Rayee Roded

1
Fantastico, questa è di gran lunga la soluzione migliore. In questo modo, root userà sempre la stessa versione di npm / node che stai usando sull'utente nvm, grazie!
luiscvalmeida

3
Ottima soluzione, ma se cambi la versione del nodo che stai utilizzando, dovrai rieseguire i comandi precedenti.
door_number_three

4
Lo uso npxabbastanza spesso. Quindi l'ho aggiunto anche io:sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npx" "/usr/local/bin/npx"
thomas

@SimpleJ come faresti lo stesso perbabel-node
user566245

14

Il tuo problema è che nvmnon è nel percorso quando usi sudo.

Quindi scrivi

$ which nvm

e il risultato sarà qualcosa di simile

/home/abc/mynvm/nvm

Riprova ora con sudo:

sudo /home/abc/mynvm/nvm use v0.10.23

Presumo che quindi ti imbatti nel problema che l'utente root non riesce a trovare la versione 0.10.13, ma vediamo il prossimo messaggio di errore ...


42
which nvmnon
esce

6
non restituisce nulla anche per root
Vitalii Korsakov

3
Il problema è che non accedo mai come root. Perché dovrei? Se ho bisogno di un accesso root, lo uso sempre sudo. Sì, posso accedere come root e installare nvm, ma in futuro non potrei eseguire sudo nvm use v0.10.25. Quindi non ho potuto usare anche sudo nodeda utente.
Vitalii Korsakov

2
which nvmnon funziona mai, vero? nvmnon è un eseguibile, è una funzione di shell. github.com/creationix/nvm/issues/540
Matt

2
Di recente ho posto una domanda simile su which nvmquesto argomento : stackoverflow.com/questions/49156104/… Utilizzare type nvmper rivelare la sua definizione. Come ha detto Matt, è una funzione di shell.
Martin Braun

13

Il motivo fondamentale è perché nvmnon è un vero programma. E 'una funzione bash che viene caricato nel dell'Utente .profile, .bashrco ... Quindi sudonon raccoglie automaticamente in su dal $ PATH come la maggior parte di altri programmi.

Un gestore di versione alternativo del nodo è n: https://github.com/tj/n . Questo è un vero programma, quindi sudolo raccoglierà tramite $ PATH senza alcun hack (a patto che sudoabbia /usr/local/binnel suo $ PATH).

sudo npm install -g n  # install 'n' globally
which n                # should be /usr/local/bin/n

sudo n lts             # need sudo to switch node versions
node --version         # v6.10.0
sudo node --version    # v6.10.0

Perfetto. Grazie "nvm non è un problema, ma una funzione bash" :)
un altro

Haha, mi sono appena reso conto del mio errore di ortografia "problema" invece di "programma";).
un altro

7

Secondo README

Quando usi nvm non hai bisogno sudodi installare globalmente un modulo con npm -g, quindi invece di farlo sudo npm install -g grunt, fallo invecenpm install -g grunt

Hai bisogno di sudo npm?

Nel mio caso, ho bisogno di sudo npm run startquale ha bisogno dell'accesso ad alcuni file che richiedono l'accesso come root. Secondo questo problema ,

Non usi sudo. Dovresti invece fare chmod / chown il file in modo che l'utente che ha nvm abbia accesso al file ;.

In somma

Il manutentore di nvm crede fermamente che non sia necessario sudo: P


6

Anch'io ho avuto il tuo problema. Finalmente ci ho aggirato. Ecco la mia soluzione:

  1. Disinstalla nvm e nodejs. Ecco alcuni link utili: Disinstallazione di nvm . Se hai installato nodejs usando apt-get, puoi disinstallarlo con il comando apt-get purge nodejs.
  2. Installa un nvm globale. Vedi questa pagina: nvm global . Come si dice, "Standard nvm ha conosciuto difficoltà a lavorare in ambienti multiutente o rooted".

Dopo aver riavviato il terminale, puoi eseguire il comando sudo nvm ls.


1
Questo ramo è di 12 commit avanti, 1123 di commit dietro creationix: master. preso direttamente dal repository xtuple per nvm
MrMesees

6
$ sudo bash -ic "nvm use stable; npm -v"
Now using node v6.3.1 (npm v3.10.3)
3.10.3

4

Ho provato lo stesso sulla mia macchina dove ho nvmanche io e ho una risposta leggermente diversa:

$ sudo node --version                                                                                                                                                                    
sudo: node: command not found

La mia ipotesi è che tu abbia installato il nodo 0.11 al di fuori di nvm. ( Tramite gestore di pacchetti o anche dalla fonte )

Pertanto, l'esecuzione del nodo tramite sudo riprenderebbe invece questo nodo autonomo.

Ha senso o mi sbaglio?


Si hai ragione. Ho installato node e poi nvm . Ma tutto funziona bene per l'utente normale e non funziona per il root.
Vitalii Korsakov

1
Oh va bene. Quindi, penso che nvm non sia pensato per essere eseguito come root. In effetti sono carino che l'esecuzione nella terra degli utenti sia una caratteristica ricercata. Tuttavia, questo potrebbe aiutarti: github.com/creationix/nvm/issues/5
Aurélien Thieriot

Questo ragazzo apparentemente ha creato un nvm speciale che gira in modalità sudo: github.com/xtuple/nvm . Purtroppo solo in modalità sudo. Non so se sia accettabile
Aurélien Thieriot

0

Installa nvm a livello globale con
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | sudo bash


creationix autori nvm, starei molto attento a questo nvm di terze parti ...
MrMesees

4
Questo ramo è di 12 commit avanti, 1123 di commit dietro creationix: master. Questo è un problema, rimuovi il link
MrMesees

8
Questa risposta mi fa sanguinare gli occhi. Non dovresti scaricare nulla ed eseguirlo in un sudo bash, wtf
CharlyDelta

In realtà, il comando wget in questi giorni termina con | bash, nessun sudo da nessuna parte: nvm-sh / nvm: Node Version Manager
Elise van Looij

0

La soluzione più semplice a questo sarà probabilmente quella di colpire l'eseguibile nvm.sh ovunque si trovi.

sudo /home/ubuntu/.nvm/nvm.sh install node

Questo funziona bene per me (supponendo che sia il percorso di installazione).

La procedura di installazione completa sarebbe simile

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
export NVM_DIR="/home/ubuntu/.nvm"

[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

E poi puoi eseguire il comando sopra per premere il nvm.sh appena installato

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.