Auf EC2: Befehl sudo node nicht gefunden, aber Knoten ohne sudo ist in Ordnung


120

Ich habe gerade nodejs auf einer neuen EC2-Mikroinstanz installiert.

Ich habe es normal installiert, ./configure -> make -> sudo make install.

Problem: Wenn ich "node" unter ec2-user starte, läuft es perfekt. Wenn ich "sudo node" ausführe, schlägt dies fehl.

Ich fand heraus, dass der Knoten in:

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

und der aktuelle Pfad ist

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

aber der sudo weg ist

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

Dann habe ich versucht, den Root-Pfad so zu bearbeiten, dass er die Pfade zum Knoten enthält. Daher wird "Knoten" ausgeführt, wenn ich als Root angemeldet bin. Es funktioniert jedoch immer noch nicht, wenn ich mich als ec2-Benutzer anmelde und "sudo node" ausführe. .

Ich brauche dies, um npm Properfly zu installieren. Haben Sie eine Idee, wie Sie den Knotenpfad beim Ausführen von "sudo node" einschließen können?


Wie haben Sie den Root-Pfad bearbeitet?
Bis auf weiteres angehalten.

Nach langem Ausprobieren habe ich dies getan und es funktioniert: <pre> sudo su export PATH = $ PATH: usr / local / node / curl npmjs.org/install.sh | sh </ pre>

Antworten:


319

Ja, es ist ein bisschen nervig, aber Sie können es mit einigen Links beheben:

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

Es mag noch mehr geben, aber das ist alles, was mir bisher begegnet ist. Das Fehlen von Node-Waf führt dazu, dass einige npmInstallationen mit einer eher kryptischen Fehlermeldung fehlschlagen.


Ich bin nur neugierig, muss diese Verknüpfung nur im Amazon AMI-System erfolgen? Trennt das Amazon AMI-System den Stammpfad vom Benutzerpfad?
Benutzer482594

Der Mangel an node-wafUrsachen npm rebuildfür Fehler aus. Gibt es einen sauberen Weg, dies zu beheben? Muss ich?
user730569

1
Das hat bei mir aus mehreren Gründen nicht funktioniert. 1) Ich habe keinen Sudo-Zugang. Ich bin auf einem gemeinsamen Host. 2) /usr/localexistiert nicht. Ich habe allerdings ein Verzeichnis ~ / local erstellt. 3) Nachdem ich jede dieser Codezeilen entfernt /usrund sudoaus meiner Konsole ausgeführt hatte, hatte sich nichts geändert.
Wolfpack'08

1
Das war hilfreich. Aber kann jemand erklären, warum und wie es die Dinge zum Laufen bringt?
Tarun Gupta

2
@Tarun: Lesen Sie die PATH-Variable der Shell und wie sie verwendet wird, um herauszufinden, welche Binärdatei für einen bestimmten Befehl ausgeführt werden soll. Der Befehl ln verknüpft nur einen zweiten Namen mit derselben Datei.
Michael Dillon

33

Ich habe /usr/local/binzu secure_pathin/etc/sudoers

$ sudo visudo

Dann ändern Sie diese Zeile:

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

Zu:

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

19

Dies geschieht, weil die ausführbare Datei des Knotens nicht in / usr / bin gefunden wird. Befolgen Sie also die Schritte:

  1. Knoten finden:

whereis node

in meinem Fall: node: /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node

  1. Erstellen Sie eine symbolische Verknüpfung für den Knoten:

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

Es ist fertig!


Toller Tipp - Ich habe es auch getan, sudo ln -s /home/ec2-user/.nvm/versions/node/v8.11.3/bin/npm /usr/bin/npmals ich versucht habe, npm installSudo auf meiner aws ec2-Instanz zu machen, nachdem ich dem Link
NULL-Zeiger

9

Warum nicht den absoluten Pfad zum Knoten verwenden? Wenn Sie ein Upstart-Skript verwenden möchten, benötigen Sie sowieso einen absoluten Pfad.

sudo /usr/local/bin/node server.js

1
Die beste Lösung funktioniert und funktioniert nicht wie alle lnLösungen mit dem System .
SidOfc

5

Versuche Folgendes:

export PATH=$PATH:/usr/local/bin
sudo node --version

2
Funktioniert nicht für Distributionen, die secure_pathin der sudoersDatei festgelegt wurden.
Kenorb

5

Sie können den vollständigen Pfad nodevon der übergeordneten Datei (Nicht-Sudo-Shell) mit dem whichBefehl an die ausführbare Datei übergeben .

sudo `which node`

4

Für mich hat es funktioniert, nur den Besitz des Knotenordners von root auf ec2-user (angemeldet als ec2-user) zu ändern.

(Hinweis: Ich habe meinen Knotenordner in / var / lib / erstellt.)

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

Dann

npm install mongojs

sollte gut funktionieren (vorausgesetzt du hast npm installiert ok natürlich!)


3

Hier ist ein Ansatz, der keine Symlinks verwendet oder root erfordert:

$ 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

Dann habe ich:

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

Die Vorteile, Knoten nicht als Root auszuführen, werden hier erläutert:

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

Es steht im Einklang mit:

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



1

In meinem Fall wurde Node ohne Sudo- Präfix installiert . Daher war der Knoten für den Superuser nicht verfügbar, weshalb er nicht funktioniertsudo node server


-1

Ich weiß nicht, ob das der richtige Weg ist, aber das habe ich getan ...

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

Dies hat npm installiert und ich kann jetzt alle gewünschten Pakete installieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.