sudo: node: comando não encontrado

4

Eu tenho um problema relacionado ao nodejs. Eu tenho binários nodejs aqui: ~/node-v8.5.0-linux-x64/ e eu tenho um link que criei usando: ln -s node-v8.5.0-linux-x64/ node .

No meu .bashrc, eu tenho isto: export PATH=$PATH:$HOME/node/bin .

node e npm estão funcionando muito bem quando eu normalmente estou conectado. Como os dois estão instalados em minha casa, não preciso estar logado como root para instalar um pacote globalmente.

Mas eu queria tentar; então eu corri:

sudo npm install -g angular-cli
sudo node app.js

e não funcionou.

sudo: node : command not found

Eu achei que talvez o $PATH mude quando eu uso sudo , mas eu verifiquei usando 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

O shell deve saber para onde ir quando digito o comando node , mas parece que não. Eu também tentei as opções -H , -i e -u para sudo , mas nada disso ajuda.

Alguém por favor pode explicar o que está acontecendo aqui?

    
por dc-p8 13.09.2017 / 14:41

1 resposta

6

Não, sudo não preserva sua variável de ambiente $PATH por motivos de segurança. Em vez disso, ele é substituído por um secure_path definido em /etc/sudoers , que você não deve alterar.

$ sudo grep secure_path /etc/sudoers
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

Você acredita ter verificado que a variável $PATH permanece a mesma com seu comando

sudo echo $PATH

mas, na verdade, o Bash expande as variáveis antes de começar a executar qualquer comando (aqui o sudo ), o que significa que a linha acima mostra seu próprio valor $PATH . Para obter um como sudo , use, por exemplo,

sudo bash -c 'echo $PATH'

O que você pode fazer é, por exemplo resolva o comando que você deseja executar ( node ou npm ) no shell do seu próprio usuário usando a substituição de processo com which :

sudo "$(which npm)" install -g angular-cli
sudo "$(which node)" app.js

Isso primeiro executa which npm ou which node como seu usuário, o que retorna o caminho absoluto dos executáveis pertencentes aos comandos especificados. Então essa saída é literalmente inserida no seu comando sudo , então sudo acredita que ela foi executada com caminhos absolutos como abaixo, removendo a necessidade de procurar algo em $PATH :

sudo /home/dc/node/bin/npm install -g angular-cli
sudo /home/dc/node/bin/node app.js
    
por Byte Commander 13.09.2017 / 15:15