ubuntu - sudo: nodo: comando no encontrado

CorePress2023-09-17  1

Tengo un problema relacionado con nodejs. Tengo binarios de nodejs aquí: ~/node-v8.5.0-linux-x64/ y tengo un enlace suave que creé usando: ln -s node-v8.5.0-linux-x64/ node.

En mi .bashrc, tengo esto: export PATH=$PATH:$HOME/node/bin.

node y npm funcionan muy bien cuando normalmente estoy conectado. Como ambos están instalados en mi casa, no necesito iniciar sesión como root para instalar un paquete globalmente.

Pero quería intentarlo; Entonces corrí:

sudo npm install -g angular-cli
sudo node app.js

y no funcionó.

sudo: node : command not found

Pensé que tal vez $PATH cambia cuando uso sudo pero luego lo verifiqué usando sudo echo $PATH:

/home/dc/bin:/home/dc/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/dc/node/bin

El shell debería saber adónde ir cuando escribo el comando node, pero parece que no es así. También probé las opciones -H, -i y -u para sudo pero nada de eso ayudatampoco.

¿Alguien puede explicar qué está pasando aquí?

  • Creo que algo se instalóProblema de conexión o enlace simbólico, siga esto Askubuntu.com/questions/49390/… - Puntero nulo 13 de septiembre de 2017 a las 13:16
  • 2 @NullpointEh, no. Tiene node/npm instalado en su directorio de inicio, que es solo una parte de la $PATH de su propio usuario. Y la suposición de que sudo conserva la variable $PATH es incorrecta, como se detalla en mi respuesta a continuación. - Comandante de bytes 13 de septiembre de 2017 a las 13:18


------------Respuesta------------

No, sudo no conserva su variable de entorno $PATH por razones de seguridad. En cambio, se reemplaza con un Secure_path ddefinido en /etc/sudoers, que no debes cambiar.

$ sudo grep secure_path /etc/sudoers
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

Crees haber verificado que la variable $PATH permanece igual con tu comando

sudo echo $PATH

pero en realidad Bash expande las variables antes de comenzar a ejecutar cualquier comando (aquí el sudo), lo que significa que la línea de arriba muestra su propio valor $PATH. Para obtener uno como sudo, use, por ejemplo,

sudo bash -c 'echo $PATH'

Lo que puedes hacer es, p. resuelva el comando que desea ejecutar (nodo o npm) en el shell de su propio usuario usando la sustitución de procesos con el cual:

sudo "$(which npm)" install -g angular-cli
sudo "$(which node)" app.js

Esto primero ejecuta what npm o what node como su usuario, lo que devuelve la ruta absoluta de los ejecutables que pertenecen a los comandos especificados. Luego, esa salida se inserta literalmente en su comando sudo, por lo que sudo realmente cree que se ejecutó con rutas absolutas como bebajo, eliminando la necesidad de buscar cualquier cosa en $PATH:

sudo /home/dc/node/bin/npm install -g angular-cli
sudo /home/dc/node/bin/node app.js



------------Respuesta------------

Podrías simplemente crear un enlace suave para nodo, npm y npx en el directorio /sbin por ejemplo

ln -s /usr/local/lib/nodejs/node-v12.14.1-linux-x64/bin/node /sbin/node

Sintaxis > ln -s (origen) (destino)

Ahoraejecutar sudo node debería funcionar


Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare