No se puede usar NVM desde root (o sudo)


104

He mencionado que mi aplicación usa una versión diferente de NodeJS cuando se ejecuta desde sudo.

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

Este v0.11.8-pre me causó algunos problemas, así que definitivamente no quiero usarlo, pero no puedo cambiarlo por root.

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

Intenté instalar nvm desde el usuario root, pero obtuve el error "NVM ya instalado", pero aún no se encontró nvm al ejecutar desde sudo. Cual es mi problema


3
Intente y sudo -s luego instale nvm.
Juegos Brainiac

@GamesBrainiac Lo siento, pero escribí que intenté instalarlo desde la raíz
Vitalii Korsakov

intente eliminar /root/.nvm/ y reinstalar nvm desde cero
Antonio E.

no hay /root/.nvm. Instalé nvm desde sudo y se instaló en el usuario normal homedir
Vitalii Korsakov

4
Esto resuelve todo mi problema como tenías github.com/xtuple/nvm
Yoo Matsuo

Respuestas:


219

La siguiente lista de comandos (fuente: digitalocean ) parece solucionar el problema

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

El comando anterior es un poco complicado, pero todo lo que hace es copiar cualquier versión del nodo que tenga activa a través de nvm en el /usr/local/directorio (donde los archivos globales instalados por el usuario deben vivir en un VPS de Linux) y configurar los permisos para que todos los usuarios puedan acceder a ellos .

¡Espero que esto ayude!


7
Gracias, me ayudó.
Vishal Kumar Verma

7
¡Gracias! Esto me ahorró mucho tiempo
Quinton Pike

4
¡Perfecto! Muchas gracias.
Jean-Baptiste Louazel

2
¡Increíble! Anoche arruiné todo mi sistema RasPi 3 al cambiar desesperadamente los permisos para npm por todas partes, hoy pasé 3 horas buscando la mejor solución para instalar node / npm globalmente sin la necesidad de sudo para cada llamada de npm. Su solución salió bien con esta publicación losant.com/blog/how-to-install-nodejs-on-raspberry-pi
bosch

3
Esto suena como una gran opción, pero sigo recibiendo estos errores: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

Mi solución es crear enlaces simbólicos a partir de las versiones de node y npmestoy usando para /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"

Esto hace npmy nodedisponible para todos los usuarios.


1
Gran solucion simplemente agregue "al final de la segunda línea ... (No pude editar esto yo mismo por alguna razón)
Rayee Roded

1
Genial, esta es, con mucho, la mejor solución. De esta manera, root siempre usará la misma versión npm / node que está usando en el usuario nvm, ¡gracias!
luiscvalmeida

3
Gran solución, pero si cambia la versión del nodo que está usando, tendrá que volver a ejecutar los comandos anteriores.
door_number_three

4
Yo uso npxbastante a menudo. Así que lo agregué también:sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npx" "/usr/local/bin/npx"
Thomas

@SimpleJ ¿cómo harías lo mismo porbabel-node
user566245

14

Su problema es que nvmno está en el camino cuando lo usa sudo.

Así que escribe

$ which nvm

y el resultado será algo como

/home/abc/mynvm/nvm

Vuelve a intentarlo ahora con sudo:

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

Supongo que luego se encuentra con el problema de que el usuario root no puede encontrar la versión 0.10.13, pero veamos el siguiente mensaje de error ...


42
which nvmno produce nada
Vitalii Korsakov

6
tampoco produce nada para root
Vitalii Korsakov

3
El problema es que nunca inicio sesión como root. ¿Por qué debería? Si necesito algún acceso de root, siempre uso sudo. Sí, puedo iniciar sesión como root e instalar nvm, pero en el futuro no pude ejecutar sudo nvm use v0.10.25. Así que tampoco pude usar sudo nodede usuario.
Vitalii Korsakov

2
which nvmnunca funciona, ¿verdad? nvmno es un ejecutable, es una función de shell. github.com/creationix/nvm/issues/540
Matt

2
Recientemente hice una pregunta similar sobre which nvmaquí: stackoverflow.com/questions/49156104/… Use type nvmpara revelar su definición. Como dijo Matt, es una función de shell.
Martin Braun

13

La razón fundamental es porque nvmno es un programa real. Es una función fiesta que se carga en el usuario de .profile, .bashrco ... Asísudo no se recupera automáticamente desde el $ PATH como la mayoría de otros programas.

Un administrador de versiones de nodo alternativo es n: https://github.com/tj/n . Ese es un programa real, por lo que sudolo recogerá a través de $ PATH sin ningún truco (siempre que sudotenga /usr/local/binen su $ 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

Perfecto. Gracias "nvm no es un problema, sino una función bash" :)
otro

Jaja, acabo de darme cuenta de mi "problema" de ortografía en lugar de "programa";).
otro

7

Según README

Cuando usa nvm, no necesita sudoinstalar globalmente un módulo con npm -g, así que en lugar de hacerlo sudo npm install -g grunt, hágalonpm install -g grunt

¿Necesita sudo npm?

En mi caso, necesito el sudo npm run startque necesita el acceso a algún archivo que requiera acceso de root. Según este tema ,

No usas sudo. En su lugar, debería usar chmod / chown el archivo para que el usuario que tiene nvm tenga acceso al archivo ;.

En suma

El responsable de mantenimiento de nvm cree firmemente que no es necesario sudo: P


6

Yo también tuve tu problema. Finalmente lo he solucionado. Aquí está mi solución:

  1. Desinstale nvm y nodejs. Aquí hay algunos enlaces útiles: Desinstalación de nvm . Si instaló nodejs usando apt-get, puede desinstalarlo con el comando apt-get purge nodejs.
  2. Instale un nvm global. Vea esta página: nvm global . Como dice, "Standard nvm tiene dificultades conocidas para trabajar en entornos multiusuario o rooteados".

Después de reiniciar su terminal, puede ejecutar el comando sudo nvm ls.


1
Esta rama tiene 12 confirmaciones por delante, 1123 confirmaciones detrás de creationix: master. tomado directamente del repositorio xtuple para 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

He intentado lo mismo en mi máquina donde también lo he hecho nvmy tengo una respuesta ligeramente diferente:

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

Supongo que ha instalado el nodo 0.11 fuera de nvm. (A través del administrador de paquetes o incluso desde la fuente )

Por lo tanto, ejecutar el nodo a través de sudo recogería este nodo independiente en su lugar.

¿Tiene sentido o me equivoco?


Sí, tiene usted razón. Instalé node y luego nvm . Pero todo funciona bien para el usuario normal y no funciona para el root.
Vitalii Korsakov

1
Oh esta bien. Entonces, creo que nvm no debe ejecutarse como root. De hecho, estoy bastante seguro de que ejecutar en la tierra del usuario es una característica deseada. Sin embargo, esto podría ayudarlo: github.com/creationix/nvm/issues/5
Aurélien Thieriot

Este tipo aparentemente hizo un nvm especial que se ejecuta en modo sudo: github.com/xtuple/nvm . Desafortunadamente, solo en modo sudo. No sé si es aceptable
Aurélien Thieriot

0

Instale nvm globalmente con
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | sudo bash


Creacionix autores nvm, tendría mucho cuidado con este nvm de terceros ...
MrMesees

4
Esta rama tiene 12 confirmaciones por delante, 1123 confirmaciones detrás de creationix: master. Esto es un problema, elimine el enlace
MrMesees

8
Esta respuesta me hace sangrar los ojos. No deberías descargar nada y ejecutarlo en un sudo bash, wtf
CharlyDelta

En realidad, el comando wget en estos días termina en | bash, no sudo en ninguna parte: nvm-sh / nvm: Node Version Manager
Elise van Looij

0

La solución más fácil para esto probablemente será simplemente presionar el ejecutable nvm.sh donde sea que esté.

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

Esto funciona bien para mí (asumiendo que esa es la ruta de instalación).

El procedimiento de instalación completo se vería así

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"

Y luego puede ejecutar el comando anterior para acceder al nvm.sh recién instalado

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.