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
.
node
et npm
fonctionnent 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 Sudo
mais 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 node
name__, mais il semble que ce ne soit pas le cas. J'ai également essayé les options -H
, -i
et -u
pour Sudo
name__, mais rien de tout cela ne les aide.
Quelqu'un peut-il s'il vous plaît expliquer ce qui se passe ici?
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