Su EC2: comando sudo node non trovato, ma il nodo senza sudo è ok


120

Ho appena installato nodejs su una nuova microistanza EC2.

L'ho installato normalmente, ./configure -> make -> sudo make install.

Problema: quando eseguo "node" sotto ec2-user, funziona perfettamente. Quando eseguo "sudo node", non funziona.

Ho scoperto che il nodo è in:

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

e il percorso attuale è

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

ma il percorso sudo è

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

quindi ho provato a modificare il PATH di root per includere i percorsi del nodo, quindi "node" viene eseguito quando sono connesso come root - ma non funzionerà ancora quando accedo come utente ec2 ed eseguo "sudo node" .

Mi serve per installare correttamente npm. Qualche idea su come includere il percorso del nodo durante l'esecuzione di "nodo sudo"?


Come hai modificato il PATH di root?
In pausa fino a nuovo avviso.

Dopo molti tentativi, l'ho fatto e funziona: <pre> sudo su export PATH = $ PATH: usr / local / node / curl npmjs.org/install.sh | sh </pre>

Risposte:


320

Sì, è un po 'fastidioso ma puoi risolverlo con alcuni link:

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

Potrebbero essercene di più, ma questo è tutto ciò che ho incontrato finora. La mancanza di node-waf farà sì che alcune npminstallazioni falliscano con un messaggio di errore piuttosto criptico.


Sono solo curioso, questo collegamento deve essere fatto solo nel sistema AMI di Amazon? Il sistema Amazon AMI separa il percorso di root dal percorso dell'utente?
user482594

Mancanza di node-wafcause npm rebuildper l'errore. C'è un modo pulito per rimediare a questo? Ne ho bisogno?
user730569

1
Questo non ha funzionato per me per un paio di motivi. 1) Non ho accesso a sudo. Sono su un host condiviso. 2) /usr/localnon esiste. Tuttavia, ho creato una directory ~ / local. 3) Dopo aver rimosso /usre sudoda ciascuna di queste righe di codice ed eseguito tramite la mia console, non è cambiato nulla.
Wolfpack'08

1
Questo è stato utile. Ma qualcuno può spiegare perché e come fa funzionare le cose?
Tarun Gupta

2
@ Tarun: leggi la variabile PATH della shell e come viene utilizzata per trovare quale binario eseguire per un dato comando. Il comando ln collega semplicemente un secondo nome allo stesso file.
Michael Dillon

33

Ho aggiunto /usr/local/bina secure_pathin/etc/sudoers

$ sudo visudo

Quindi cambia questa riga:

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

Per:

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

19

accade perché l'eseguibile del nodo non si trova in / usr / bin. Quindi segui i passaggi:

  1. trova nodo:

whereis node

nel mio caso: node: /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node

  1. creare un collegamento simbolico per il nodo:

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

E 'fatto!


ottimo consiglio - Ho anche fatto sudo ln -s /home/ec2-user/.nvm/versions/node/v8.11.3/bin/npm /usr/bin/npmcome stavo cercando di fare sudo npm installsulla mia istanza aws ec2 dopo aver seguito il collegamento
Puntatore NULL

9

Perché non utilizzare il percorso assoluto per il nodo? Se si prevede di utilizzare uno script upstart, sarà comunque necessario un percorso assoluto.

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

1
soluzione migliore, funziona e non crea problemi con il sistema come fanno tutte le lnsoluzioni.
SidOfc

5

prova quanto segue:

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

2
Non funzionerà per le distribuzioni secure_pathimpostate in sudoersfile.
kenorb

5

È possibile passare il percorso completo nodeall'eseguibile dal genitore (shell non sudo) usando il whichcomando.

sudo `which node`

4

Per me, ha funzionato solo per cambiare la proprietà della cartella del nodo da root a ec2-user (connesso come ec2-user).

(Nota: ho creato la mia cartella del nodo in / var / lib /)

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

Poi

npm install mongojs

dovrebbe funzionare bene (a condizione che tu abbia installato npm ok ovviamente!)


3

Ecco un approccio che non utilizza collegamenti simbolici o richiede 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

Poi ho fatto:

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

I vantaggi di non eseguire il nodo come root sono discussi qui:

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

È in linea con:

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



1

Nel mio caso, Node è stato installato senza il prefisso sudo . Quindi il nodo non era disponibile per il superutente, ecco perché non funzionasudo node server


-1

Non so se sia la strada giusta, ma è quello che ho fatto ...

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

Questo ha installato npm e ora posso installare tutti i pacchetti che voglio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.