web-dev-qa-db-fra.com

sudo: node: commande non trouvée

J'ai un problème lié à nodejs. J'ai binaires nodejs ici: ~/node-v8.5.0-linux-x64/ et j'ai un lien symbolique que j'ai créé en utilisant: ln -s node-v8.5.0-linux-x64/ node.

Dans mon .bashrc, j'ai ceci: export PATH=$PATH:$HOME/node/bin.

nodeet npmfonctionnent bien lorsque je suis connecté normalement. Comme ils sont tous les deux installés chez moi, je n'ai pas besoin d'être connecté en tant que root pour installer un package globalement.

Mais je voulais essayer. alors j'ai couru:

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

et ça n'a pas marché.

Sudo: node : command not found

Je pensais que peut-être le $PATH change lorsque j'utilise Sudomais je l'ai vérifié à l'aide de 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

Le shell devrait savoir où aller quand je tape la commande nodename__, mais il semble que ce ne soit pas le cas. J'ai également essayé les options -H, -i et -u pour Sudoname__, mais rien de tout cela ne les aide.

Quelqu'un peut-il s'il vous plaît expliquer ce qui se passe ici?

4
dc-p8

Non, Sudo ne pas préserve votre variable d'environnement $PATH pour des raisons de sécurité. Au lieu de cela, il est remplacé par un secure_path défini dans /etc/sudoers, que vous ne devriez pas modifier.

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

Vous pensez avoir vérifié que la variable $PATH reste la même avec votre commande

Sudo echo $PATH

mais en réalité, Bash développe les variables avant de commencer à exécuter une commande (ici, le Sudo), ce qui signifie que la ligne ci-dessus montre votre propre valeur $PATH. Pour obtenir celui-ci sous le nom Sudo, utilisez par exemple.

Sudo bash -c 'echo $PATH'

Ce que vous pouvez faire, c'est par exemple résolvez la commande que vous voulez exécuter (node ou npm) dans le shell de votre propre utilisateur en utilisant la substitution de processus avec which:

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

Ceci commence par exécuter which npm ou which node en tant qu'utilisateur, ce qui renvoie le chemin absolu des exécutables appartenant aux commandes spécifiées. Ensuite, cette sortie est littéralement insérée dans votre commande Sudo. Ainsi, Sudo pense en réalité qu’il a été exécuté avec des chemins absolus comme ci-dessous, ce qui évite de rechercher quoi que ce soit dans $PATH:

Sudo /home/dc/node/bin/npm install -g angular-cli
Sudo /home/dc/node/bin/node app.js
7
Byte Commander