En EC2: el comando del nodo sudo no se encuentra, pero el nodo sin sudo está bien

120

Acabo de instalar nodejs en una nueva micro instancia EC2.

Lo instalé normalmente, ./configure -> make -> sudo make install.

Problema: cuando ejecuto "node" en ec2-user, funciona perfectamente. Cuando ejecuto "sudo node", falla.

Descubrí que el nodo está en:

[ec2-user@XXXX ~]$ whereis node
node: /usr/local/bin/node /usr/local/lib/node

y el camino actual es

[ec2-user@XXXX ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/opt/aws/bin:/home/ec2-user/bin

pero, la ruta de sudo es

[root@ip-10-112-222-32 ~]# echo $PATH
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin

luego intenté editar la RUTA raíz para incluir las rutas al nodo, por lo que "nodo" se ejecuta cuando inicio sesión como raíz, pero aún no funciona cuando inicio sesión como ec2-user y ejecuto "sudo nodo" .

Necesito esto para instalar npm correctfly. ¿Alguna idea de cómo incluir la ruta del nodo mientras se ejecuta "sudo node"?

foobar
fuente
¿Cómo editaste la ruta raíz?
Pausado hasta nuevo aviso.
Después de mucho intentarlo, hice esto y funciona: <pre> sudo su export PATH = $ PATH: usr / local / node / curl npmjs.org/install.sh | sh </pre>

Respuestas:

320

Sí, es un poco molesto pero puedes solucionarlo con algunos enlaces:

sudo ln -s /usr/local/bin/node /usr/bin/node
sudo ln -s /usr/local/lib/node /usr/lib/node
sudo ln -s /usr/local/bin/npm /usr/bin/npm
sudo ln -s /usr/local/bin/node-waf /usr/bin/node-waf

Puede que haya más, pero eso es todo lo que he encontrado hasta ahora. La falta de node-waf hará que algunas npminstalaciones fallen con un mensaje de error bastante críptico.

Michael Dillon
fuente
Solo tengo curiosidad, ¿este enlace debe realizarse solo en el sistema Amazon AMI? ¿El sistema Amazon AMI separa la ruta raíz de la ruta del usuario?
user482594
Falta de node-wafcausas npm rebuildde error. ¿Existe una forma clara de remediar esto? ¿Realmente necesito?
user730569
1
Esto no funcionó para mí por un par de razones. 1) No tengo acceso a sudo. Estoy en un host compartido. 2) /usr/localno existe. Aunque hice un directorio ~ / local. 3) Después de eliminar /usry sudode cada una de estas líneas de código y ejecutarlas en mi consola, nada había cambiado.
Wolfpack'08
1
Eso fue útil. Pero, ¿alguien puede explicar por qué y cómo funciona?
Tarun Gupta
2
@Tarun: lea la variable PATH del shell y cómo se usa para encontrar qué binario ejecutar para cualquier comando dado. El comando ln simplemente vincula un segundo nombre al mismo archivo.
Michael Dillon
33

He añadido /usr/local/bina secure_pathen/etc/sudoers

$ sudo visudo

Luego cambia esta línea:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

A:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
Jack Frost
fuente
19

sucede porque el ejecutable del nodo no se encuentra en / usr / bin. Entonces sigue los pasos:

  1. buscar nodo:

whereis node

en mi caso: node: /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node

  1. hacer un enlace simbólico para el nodo:

    sudo ln -s /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node /usr/bin/node

¡Está hecho!

Jeff Pal
fuente
gran consejo: también hice sudo ln -s /home/ec2-user/.nvm/versions/node/v8.11.3/bin/npm /usr/bin/npmlo que estaba tratando de hacer sudo npm installen mi instancia de aws ec2 después de seguir el enlace
puntero NULL
9

¿Por qué no utilizar la ruta absoluta al nodo? Si planea utilizar un script advenedizo, de todos modos necesitará una ruta absoluta.

sudo /usr/local/bin/node server.js
Shripad Krishna
fuente
1
la mejor solución, funciona y no se mete con el sistema como lo hacen todas las lnsoluciones.
SidOfc
5

prueba lo siguiente:

export PATH=$PATH:/usr/local/bin
sudo node --version
Amro
fuente
2
No funcionará para distribuciones que se hayan secure_pathestablecido en el sudoersarchivo.
kenorb
5

Puede pasar la ruta completa al nodeejecutable desde el padre (shell no sudo) usando el whichcomando.

sudo `which node`
Pavel Zubkou
fuente
4

Para mí, funcionó simplemente para cambiar la propiedad de la carpeta del nodo de root a ec2-user (iniciado sesión como ec2-user).

(Nota: creé mi carpeta de nodo en / var / lib /)

sudo chown -R ec2-user /var/lib/node/

Luego

npm install mongojs

debería funcionar bien (siempre que haya instalado npm ok, por supuesto!)

usuario1839216
fuente
3

Aquí hay un enfoque que no usa enlaces simbólicos ni requiere root:

$ git clone https://github.com/joyent/node.git
$ cd node
$ mkdir ~/opt
$ export PREFIX=~/opt; ./configure
$ make
$ make install
$ echo 'export PATH=~/opt/bin:${PATH}' >> ~/.bashrc

Entonces lo hice:

$ git clone https://github.com/isaacs/npm.git
$ cd npm
$ make install

Los beneficios de no ejecutar el nodo como root se discuten aquí:

http://increaseyourgeek.wordpress.com/2010/08/18/install-node-js-without-using-sudo/

Está en línea con:

https://github.com/joyent/node/wiki/Installation

Jack Murphy
fuente
3

¿Qué tal usar "sudo $ (qué nodo)" en lugar de "sudo nodo"?

Will Voelcker
fuente
¡Trabajado como un encanto!
lordneru
1

En mi caso, Node se instaló sin el prefijo sudo . Entonces el nodo no estaba disponible para el superusuario, por eso no funcionasudo node server

Shubham
fuente
-1

No sé si esta es la forma correcta, pero esto es lo que hice ...

sudo su
export PATH=$PATH:/home/ec2-user/local/node/bin
curl http://npmjs.org/install.sh | sh
chown -R ec2-user /home/ec2-user/local/node
exit

Esto instaló npm, y ahora puedo instalar cualquier paquete que desee.

bdavis
fuente