No EC2: comando sudo node não encontrado, mas o nó sem sudo está ok

120

Acabei de instalar o nodejs em uma nova micro instância do EC2.

Eu o instalei normalmente ./configure -> make -> sudo make install.

Problema: Quando executo o "nó" no usuário ec2, ele funciona perfeitamente. Quando executo o "nó do sudo", ele falha.

Eu descobri que o nó está em:

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

e o caminho atual é

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

mas, o caminho do sudo é

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

tentei editar o PATH raiz para incluir os caminhos para o nó, para que o "nó" seja executado quando eu estiver logado como raiz - mas ainda não funcionará quando eu fizer logon como usuário ec2 e executar "sudo node" .

Eu preciso disso para instalar o npm Properfly. Alguma idéia de como incluir o caminho do nó durante a execução do "nó sudo"?

foobar
fonte
Como você editou o PATH raiz?
Pausado até novo aviso.
Depois de muito tentar, fiz isso e funciona: <pre> sudo su export PATH = $ PATH: usr / local / node / curl npmjs.org/install.sh | sh </pre>

Respostas:

319

Sim, é um pouco chato, mas você pode corrigi-lo com alguns links:

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

Pode haver mais, mas isso é tudo o que encontrei até agora. A falta de node-waf fará com que algumas npminstalações falhem com uma mensagem de erro um tanto enigmática.

Michael Dillon
fonte
Só estou curioso, essa ligação deve ser feita apenas no sistema Amazon AMI? O sistema Amazon AMI separa o caminho raiz do caminho do usuário?
user482594
Falta de node-wafcausas npm rebuildpara erro. Existe uma maneira limpa de remediar isso? Eu preciso?
user730569
1
Isso não funcionou para mim por alguns motivos. 1) Não tenho acesso ao sudo. Estou em um host compartilhado. 2) /usr/localnão existe. Eu criei um diretório ~ / local, no entanto. 3) Depois de remover /usre sudode cada uma dessas linhas de código e executá-las no meu console, nada havia mudado.
Wolfpack'08
1
Isso foi útil. Mas alguém pode expulsar por que e como isso faz as coisas funcionarem?
Tarun Gupta
2
@ Tarun: leia a variável PATH do shell e como ela é usada para encontrar qual binário executar para qualquer comando. O comando ln apenas vincula um segundo nome ao mesmo arquivo.
Michael Dillon
33

Eu adicionei /usr/local/bina secure_pathem/etc/sudoers

$ sudo visudo

Então mude esta linha:

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

Para:

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

isso acontece porque o nó executável não foi encontrado em / usr / bin. Então siga as etapas:

  1. encontrar o nó:

whereis node

No meu caso: node: /home/<my_user>/.nvm/versions/node/v8.9.4/bin/node

  1. faça um link simbólico para o nó:

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

Está feito!

Jeff Pal
fonte
grande dica - Eu também fiz sudo ln -s /home/ec2-user/.nvm/versions/node/v8.11.3/bin/npm /usr/bin/npmcomo eu estava tentando fazer sudo npm installna instância meu AWS EC2 depois de seguir ligação
ponteiro NULL
9

Por que não usar o caminho absoluto para o nó? Se você planeja usar um script inicial, ele precisará de um caminho absoluto.

sudo /usr/local/bin/node server.js
Shripad Krishna
fonte
1
melhor solução, funciona e não mexe com o sistema, como todas as lnsoluções.
SidOfc
5

tente o seguinte:

export PATH=$PATH:/usr/local/bin
sudo node --version
Amro
fonte
2
Não funcionará para distribuições secure_pathdefinidas em sudoersarquivo.
kenorb
5

Você pode passar o caminho completo para o nodeexecutável do pai (shell não sudo) usando o whichcomando

sudo `which node`
Pavel Zubkou
fonte
4

Para mim, funcionou apenas para alterar a propriedade da pasta do nó da raiz para o usuário ec2 (conectado como usuário ec2).

(Nota: criei a pasta do nó em / var / lib /)

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

Então

npm install mongojs

deve funcionar bem (desde que você tenha instalado o npm ok, é claro!)

user1839216
fonte
3

Aqui está uma abordagem que não usa links simbólicos ou requer raiz:

$ 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

Então eu fiz:

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

Os benefícios de não executar o nó como raiz são discutidos aqui:

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

Está alinhado com:

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

Jack Murphy
fonte
3

Que tal usar "sudo $ (qual nó)" em vez de "sudo node"?

Will Voelcker
fonte
Trabalhou como um encanto!
lordneru 12/01
1

No meu caso, o Node foi instalado sem o prefixo sudo . Portanto, o nó não estava disponível para o superusuário, por isso não está funcionandosudo node server

Shubham
fonte
-1

Não sei se é o caminho certo, mas foi o que fiz ...

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

Isso instalou o npm e agora posso instalar os pacotes que eu desejar.

bdavis
fonte