Sur EC2: commande de nœud sudo introuvable, mais le nœud sans sudo est ok

120

Je viens d'installer nodejs sur une nouvelle micro-instance EC2.

Je l'ai installé normalement, ./configure -> make -> sudo make install.

Problème: lorsque j'exécute "node" sous ec2-user, il fonctionne parfaitement. Lorsque j'exécute "sudo node", cela échoue.

J'ai découvert que le nœud est dans:

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

et le chemin actuel est

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

mais, le chemin sudo est

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

puis j'ai essayé de modifier le PATH racine pour inclure les chemins vers le nœud, donc "node" s'exécute lorsque je suis connecté en tant que root - mais cela ne fonctionnera toujours pas lorsque je me connecte en tant qu'utilisateur ec2 et lance "sudo node" .

J'en ai besoin pour installer npm properfly. Une idée sur la façon d'inclure le chemin du nœud lors de l'exécution de "sudo node"?

foobar
la source
Comment avez-vous édité le chemin racine?
Suspendu jusqu'à nouvel ordre.
Après de nombreux essais, j'ai fait ceci et cela fonctionne: <pre> sudo su export PATH = $ PATH: usr / local / node / curl npmjs.org/install.sh | sh </pre>

Réponses:

320

Oui, c'est un peu ennuyeux mais vous pouvez le réparer avec quelques liens:

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

Il y en a peut-être plus, mais c'est tout ce que j'ai rencontré jusqu'à présent. Le manque de node-waf entraînera l' npméchec de certaines installations avec un message d'erreur plutôt cryptique.

Michael Dillon
la source
Je suis juste curieux de savoir si cette liaison doit être effectuée uniquement dans le système Amazon AMI? Le système Amazon AMI sépare-t-il le chemin racine du chemin utilisateur?
user482594
Manque de node-wafcauses npm rebuildd'erreur. Y a-t-il un moyen propre de remédier à cela? Est ce que j'ai besoin de?
user730569
1
Cela n'a pas fonctionné pour moi pour plusieurs raisons. 1) Je n'ai pas d'accès sudo. Je suis sur un hôte partagé. 2) /usr/localn'existe pas. J'ai cependant créé un répertoire ~ / local. 3) Après avoir supprimé /usret sudode chacune de ces lignes de code et les avoir exécutées via ma console, rien n'avait changé.
Wolfpack'08
1
C'était utile. Mais quelqu'un peut-il expliquer pourquoi et comment cela fait fonctionner les choses?
Tarun Gupta
2
@Tarun: lisez la variable PATH du shell et comment elle est utilisée pour trouver quel binaire exécuter pour une commande donnée. La commande ln lie simplement un deuxième nom au même fichier.
Michael Dillon
33

J'ai ajouté /usr/local/binà secure_pathen/etc/sudoers

$ sudo visudo

Puis changez cette ligne:

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

À:

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

cela se produit parce que l'exécutable du nœud n'est pas trouvé dans / usr / bin. Alors suivez les étapes:

  1. trouver le nœud:

whereis node

dans mon cas: node: /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node

  1. créer un lien symbolique pour le nœud:

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

C'est fait!

Jeff Pal
la source
bon conseil - j'ai aussi fait sudo ln -s /home/ec2-user/.nvm/versions/node/v8.11.3/bin/npm /usr/bin/npmcomme j'essayais de faire sudo npm installsur mon instance aws ec2 après avoir suivi le lien
pointeur NULL
9

Pourquoi ne pas utiliser le chemin absolu vers le nœud? Si vous prévoyez d'utiliser un script upstart, il vous faudra de toute façon un chemin absolu.

sudo /usr/local/bin/node server.js
Shripad Krishna
la source
1
meilleure solution, fonctionne et ne gâche pas le système comme toutes les lnsolutions le font.
SidOfc
5

essayez ce qui suit:

export PATH=$PATH:/usr/local/bin
sudo node --version
Amro
la source
2
Ne fonctionnera pas pour les distributions secure_pathdéfinies dans le sudoersfichier.
kenorb
5

Vous pouvez passer le chemin complet de l' nodeexécutable à partir du parent (shell non sudo) à l'aide de la whichcommande.

sudo `which node`
Pavel Zubkou
la source
4

Pour moi, cela a fonctionné pour simplement changer la propriété du dossier de nœud de racine à ec2-user (connecté en tant qu'ec2-user).

(Remarque: j'ai créé mon dossier de nœuds dans / var / lib /)

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

ensuite

npm install mongojs

devrait fonctionner correctement (à condition que vous ayez installé npm bien sûr!)

user1839216
la source
3

Voici une approche qui n'utilise pas de liens symboliques ou qui nécessite 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

Puis j'ai fait:

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

Les avantages de ne pas exécuter node en tant que root sont discutés ici:

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

Il est en ligne avec:

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

Jack Murphy
la source
3

Que diriez-vous d'utiliser "sudo $ (quel nœud)" au lieu de "sudo node"?

Will Voelcker
la source
A travaillé comme un charme!
lordneru le
1

Dans mon cas, Node a été installé sans préfixe sudo . Le nœud n'était donc pas disponible pour le super-utilisateur, c'est pourquoi il ne fonctionne passudo node server

Shubham
la source
-1

Je ne sais pas si c'est la bonne façon, mais c'est ce que j'ai fait ...

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

Cela a installé npm, et je peux maintenant installer tous les packages que je veux.

bdavis
la source