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í?
------------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