Não é possível usar NVM da raiz (ou sudo)


104

Mencionei que meu aplicativo usa uma versão diferente do NodeJS ao ser executado sudo.

$ node -v
v0.10.23
$ sudo node -v
v0.11.8-pre

Este v0.11.8-pre me causou alguns problemas, então definitivamente não quero usá-lo, mas não posso alterá-lo para root.

$ sudo nvm use v0.10.23
sudo: nvm: command not found

Eu tentei instalar o nvm do usuário root, mas obtive o erro "NVM já instalado", mas ainda não foi encontrado o nvm durante a execução sudo. Qual é o meu problema?


3
Experimente sudo -s e instale nvm.
Games Brainiac

@GamesBrainiac Desculpe, mas escrevi que tentei instalar a partir do root
Vitalii Korsakov

tente excluir /root/.nvm/ e reinstalar nvm do zero
Antonio E.

não há /root/.nvm. Eu instalei o nvm do sudo e ele foi instalado no usuário regular
homedir

4
Isso resolve todos os meus problemas, pois você tinha github.com/xtuple/nvm
Yoo Matsuo

Respostas:


220

A lista de comandos abaixo (fonte: digitalocean ) parece resolver o problema

n=$(which node); \
n=${n%/bin/node}; \
chmod -R 755 $n/bin/*; \
sudo cp -r $n/{bin,lib,share} /usr/local

O comando acima é um pouco complicado, mas tudo o que ele faz é copiar qualquer versão do nó que você tenha ativo via nvm para o /usr/local/diretório (onde os arquivos globais instalados pelo usuário devem residir em um VPS Linux) e definir as permissões para que todos os usuários possam acessá-los .

Espero que isto ajude!


7
Obrigado, isso me ajudou.
Vishal Kumar Verma

7
Obrigado! Isso me economizou muito tempo
Quinton Pike

4
Perfeito! Muito obrigado.
Jean-Baptiste Louazel

2
Impressionante! Ontem à noite eu arruinei todo o meu sistema RasPi 3 alterando desesperadamente as permissões para npm em todo o lugar, hoje passei 3h procurando a melhor solução para instalar node / npm globalmente sem a necessidade de sudo para cada chamada de npm. Sua solução foi bem com esta postagem losant.com/blog/how-to-install-nodejs-on-raspberry-pi
bosch

3
Parece uma ótima opção, mas continuo recebendo estes erros:chmod: cannot operate on dangling symlink ‘/home/ec2-user/.nvm/versions/node/v7.1.0/bin/node-debug’ chmod: cannot operate on dangling symlink ‘/home/ec2-user/.nvm/versions/node/v7.1.0/bin/node-inspector’
trex005

129

Minha solução é criar links simbólicos a partir das versões de nodee npmestou usando para /usr/local/bin:

sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/node" "/usr/local/bin/node"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npm" "/usr/local/bin/npm"

Isso torna npme está nodedisponível para todos os usuários.


1
Ótima solução. basta adicionar "no final da segunda linha ... (não consegui editar por algum motivo)
Rayee Roded

1
Ótimo, essa é de longe a melhor solução. Dessa forma, o root sempre usará a mesma versão npm / node que você está usando no usuário nvm, obrigado!
luiscvalmeida

3
Ótima solução, mas se você alterar a versão do nó que está usando, terá que executar novamente os comandos acima.
door_number_three

4
Eu uso com npxbastante frequência. Então eu adicionei também:sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npx" "/usr/local/bin/npx"
thomas

@SimpleJ como você faria o mesmo porbabel-node
user566245

14

Seu problema é que nvmnão está no caminho quando você usa sudo.

Então digite

$ which nvm

e o resultado será algo como

/home/abc/mynvm/nvm

Tente novamente agora com sudo:

sudo /home/abc/mynvm/nvm use v0.10.23

Presumo que você tenha o problema de que o usuário root não consegue encontrar a versão 0.10.13, mas vamos ver a próxima mensagem de erro ...


42
which nvmnão produz nada
Vitalii Korsakov

6
também não produz nada para o root
Vitalii Korsakov

3
O problema é que eu nunca logo como root. Por que eu deveria? Se eu precisar de algum acesso root, sempre uso sudo. Sim, posso fazer o login como root e instalar o nvm, mas no futuro não poderei executar sudo nvm use v0.10.25. Portanto, não pude usar sudo nodedo usuário também.
Vitalii Korsakov

2
which nvmnunca funciona, não é? nvmnão é um executável, é uma função shell. github.com/creationix/nvm/issues/540
Matt

2
Recentemente fiz uma pergunta semelhante sobre which nvmaqui: stackoverflow.com/questions/49156104/… Use type nvmpara revelar sua definição. Como Matt disse, é uma função shell.
Martin Braun,

13

A razão fundamental é porque nvmnão é um programa real. É uma função bash que é carregado no usuário de .profile, .bashrcou ... Então, sudonão pegá-lo automaticamente a partir do $ PATH como a maioria dos outros programas.

Um gerenciador de versão de nó alternativo é n: https://github.com/tj/n . Este é um programa real, então sudoirá pegá-lo via $ PATH sem quaisquer hacks (contanto que sudotenha /usr/local/binem seu $ PATH).

sudo npm install -g n  # install 'n' globally
which n                # should be /usr/local/bin/n

sudo n lts             # need sudo to switch node versions
node --version         # v6.10.0
sudo node --version    # v6.10.0

Perfeito. Obrigado "nvm não é um problema, mas uma função bash" :)
outro

Haha, acabei de perceber sobre meu erro de grafia "problema" em vez de "programa";).
outro

7

De acordo com README

Ao usar o nvm, você não precisa sudoinstalar globalmente um módulo com npm -g, então, em vez de fazer sudo npm install -g grunt, façanpm install -g grunt

Precisa de sudo npm?

No meu caso, preciso de sudo npm run startqual precisa de acesso a algum arquivo que requer acesso root. De acordo com este problema ,

Você não usa sudo. Em vez disso, você deve chmod / chown o arquivo para que o usuário que possui nvm tenha acesso ao arquivo ;.

Em suma

O mantenedor do nvm acredita fortemente que não precisamos sudo: P


6

Eu também tive o seu problema. Finalmente resolvi isso. Aqui está minha solução:

  1. Desinstale o nvm e o nodejs. Aqui estão alguns links úteis: Desinstalação do nvm . Se você instalou nodejs usando apt-get, pode desinstalá-lo com o comando apt-get purge nodejs.
  2. Instale um nvm global. Veja esta página: nvm global . Como diz, "o nvm padrão conhece dificuldades para trabalhar em ambientes multiusuário ou com acesso root."

Depois de reiniciar seu terminal, você pode executar o comando sudo nvm ls.


1
Este branch tem 12 commits à frente, 1123 commits atrás do creationix: master. retirado diretamente do xtuple repo para nvm
MrMesees de

6
$ sudo bash -ic "nvm use stable; npm -v"
Now using node v6.3.1 (npm v3.10.3)
3.10.3

4

Eu tentei o mesmo na minha máquina onde também tentei nvme obtive uma resposta ligeiramente diferente:

$ sudo node --version                                                                                                                                                                    
sudo: node: command not found

Meu palpite é que você instalou o nó 0.11 fora do nvm. ( Via gerenciador de pacotes ou mesmo da fonte )

Portanto, executar o nó por meio do sudo selecionaria esse nó independente.

Isso faz sentido ou estou enganado?


Sim você está certo. Eu instalei o node e então o nvm . Mas tudo funciona bem para o usuário normal e não funciona para o root.
Vitalii Korsakov

1
Oh certo. Então, acho que o nvm não foi feito para ser executado como root. Na verdade, estou certo de que correr no terreno do usuário é um recurso desejado. No entanto, isso pode ajudá-lo: github.com/creationix/nvm/issues/5
Aurélien Thieriot

Esse cara aparentemente fez um nvm especial que roda no modo sudo: github.com/xtuple/nvm . Infelizmente, apenas no modo sudo. Não sei se é aceitável
Aurélien Thieriot

0

Instale nvm globalmente com
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | sudo bash


autores da creationix nvm, eu teria muito cuidado com este nvm de terceiros ...
MrMesees

4
Este branch tem 12 commits à frente, 1123 commits atrás do creationix: master. Este é um problema, remova o link
MrMesees

8
Essa resposta faz meus olhos sangrarem. Você simplesmente não deve baixar nada e executá-lo em um sudo bash, wtf
CharlyDelta

Na verdade, o comando wget hoje em dia termina em | bash, no sudo em lugar nenhum: nvm-sh / nvm: Node Version Manager
Elise van Looij

0

A solução mais fácil para isso provavelmente será acessar o executável nvm.sh onde quer que ele esteja.

sudo /home/ubuntu/.nvm/nvm.sh install node

Isso funciona bem para mim (assumindo que seja o caminho de instalação).

O procedimento de instalação completo pareceria

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
export NVM_DIR="/home/ubuntu/.nvm"

[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

E então você pode executar o comando acima para acessar o nvm.sh recém-instalado

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.