Nie można użyć NVM z roota (lub sudo)

105

Wspomniałem, że moja aplikacja używa innej wersji NodeJS podczas uruchamiania z sudo.

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

Ta wersja 0.11.8-pre spowodowała pewne problemy, więc zdecydowanie nie chcę jej używać, ale nie mogę jej zmienić na roota.

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

Próbowałem zainstalować nvm od użytkownika root, ale pojawił się błąd „NVM już zainstalowany”, ale nadal nie znaleziono nvm podczas uruchamiania z sudo. Jaki jest mój problem?

Vitalii Korsakov
źródło
3
Spróbuj, sudo -s a następnie zainstaluj nvm.
Games Brainiac
@GamesBrainiac Przepraszamy, ale napisałem, że próbowałem zainstalować go z roota
Vitalii Korsakov
spróbuj usunąć /root/.nvm/ i ponownie zainstalować nvm od zera
Antonio E.
nie ma /root/.nvm. Zainstalowałem nvm z sudo i został on zainstalowany w domenie zwykłego użytkownika
Vitalii Korsakov
4
To rozwiązuje cały mój problem, tak jak w przypadku github.com/xtuple/nvm
Yoo Matsuo

Odpowiedzi:

220

Poniższa lista poleceń (źródło: digitalocean ) wydaje się rozwiązywać problem

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

Powyższe polecenie jest nieco skomplikowane, ale wszystko, co robi, to kopiowanie dowolnej wersji węzła, którą masz aktywną przez nvm do /usr/local/katalogu (gdzie zainstalowane przez użytkownika pliki globalne powinny znajdować się na Linux VPS) i ustawianie uprawnień tak, aby wszyscy użytkownicy mieli do nich dostęp .

Mam nadzieję że to pomoże!

Venkat Selvan
źródło
7
Dzięki, pomogło mi.
Vishal Kumar Verma
7
Dziękuję Ci! Zaoszczędziło mi to dużo czasu
Quinton Pike,
4
Idealny! Dziękuję bardzo.
Jean-Baptiste Louazel
2
Niesamowite! Ostatniej nocy zrujnowałem cały system RasPi 3, desperacko zmieniając uprawnienia dla npm w każdym miejscu, dzisiaj spędziłem 3 godziny na poszukiwaniu najlepszego rozwiązania do globalnej instalacji node / npm bez potrzeby sudo dla każdego połączenia npm. Twoje rozwiązanie poszło dobrze z tym postem losant.com/blog/how-to-install-nodejs-on-raspberry-pi
bosch
3
Brzmi to jak świetna opcja, ale ciągle otrzymuję te błędy: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
130

Moim rozwiązaniem jest tworzenie dowiązań symbolicznych z wersji nodei npmużywam do /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"

To udostępnia npmi nodeudostępnia wszystkim użytkownikom.

SimpleJ
źródło
1
Świetne rozwiązanie. po prostu dodaj „na końcu drugiej linii ... (z jakiegoś powodu nie mogłem tego samodzielnie edytować)
Rayee Roded
1
Świetnie, to zdecydowanie najlepsze rozwiązanie. W ten sposób root zawsze będzie używał tej samej wersji npm / node, której używasz na użytkowniku nvm, dzięki!
luiscvalmeida
3
Świetne rozwiązanie, ale jeśli zmienisz wersję używanego węzła, będziesz musiał ponownie uruchomić powyższe polecenia.
door_number_three
4
Używam npxdość często. Dodałem więc również:sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npx" "/usr/local/bin/npx"
thomas
@SimpleJ, jak byś zrobił to samo dlababel-node
user566245,
14

Twój problem polega na tym, że nvmnie ma tego na ścieżce, gdy używasz sudo.

Więc wpisz

$ which nvm

a wynik będzie podobny

/home/abc/mynvm/nvm

Spróbuj ponownie teraz z sudo:

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

Zakładam, że natrafisz na problem polegający na tym, że użytkownik root nie może znaleźć wersji 0.10.13, ale zobaczmy następny komunikat o błędzie ...

CFrei
źródło
42
which nvmnic nie
daje
6
nie daje też nic dla roota
Vitalii Korsakov
3
Problem w tym, że nigdy nie loguję się jako root. Dlaczego powinienem? Jeśli potrzebuję dostępu do roota, zawsze używam sudo. Tak, mogę zalogować się jako root i zainstalować nvm, ale w przyszłości nie będę mógł go uruchomić sudo nvm use v0.10.25. Więc nie mogłem używać również sudo nodeod użytkownika.
Vitalii Korsakov
2
which nvmnigdy nie działa, prawda? nvmnie jest plikiem wykonywalnym, to funkcja powłoki. github.com/creationix/nvm/issues/540
Matt
2
Niedawno zadałem which nvmtutaj podobne pytanie : stackoverflow.com/questions/49156104/ ... Użyj, type nvmaby ujawnić jego definicję. Jak powiedział Matt, jest to funkcja powłoki.
Martin Braun,
13

Podstawowym powodem jest to, że nvmnie jest to prawdziwy program. Jest to funkcja, która zostanie załadowana bash w instrukcji .profile, .bashrcalbo ... Więc sudonie jest automatycznie go odebrać od $ PATH jak większość innych programów.

Alternatywny menedżer wersji węzła to n: https://github.com/tj/n . To jest prawdziwy program, więc sudopobierze go za pośrednictwem $ PATH bez żadnych hacków (o ile sudoma /usr/local/binw swoim $ 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
wisbucky
źródło
Idealny. Dzięki "nvm to nie problem, ale funkcja bash" :)
kolejny
Haha, właśnie zdałem sobie sprawę z mojego błędu w pisowni „problem” zamiast „program”;).
kolejny
7

Według README

Używając nvm, nie musisz sudoglobalnie instalować modułu za pomocą npm -g, więc zamiast tego sudo npm install -g gruntzróbnpm install -g grunt

Potrzebujesz sudo npm?

W moim przypadku potrzebuję sudo npm run startdostępu do jakiegoś pliku wymagającego uprawnień administratora. Zgodnie z tym problemem ,

Nie używasz sudo. Zamiast tego powinieneś chmod / chown plik, aby użytkownik, który ma nvm miał do niego dostęp ;.

W sumie

Opiekun nvm jest przekonany, że nie musimy sudo: P

lzl124631x
źródło
6

Ja też miałem twój problem. Wreszcie udało mi się to obejść. Oto moje rozwiązanie:

  1. Odinstaluj nvm i nodejs. Oto kilka pomocnych linków: Dezinstalacja nvm . Jeśli zainstalowałeś nodejs za pomocą apt-get, możesz go odinstalować za pomocą polecenia apt-get purge nodejs.
  2. Zainstaluj globalny plik nvm. Zobacz tę stronę: nvm global . Jak napisano, „Standard NVM ma znane trudności w pracy w środowiskach z wieloma użytkownikami lub z dostępem do roota”.

Po ponownym uruchomieniu terminala możesz uruchomić polecenie sudo nvm ls.

Qianyue
źródło
1
Ta gałąź ma 12 zatwierdzeń do przodu, 1123 zatwierdzeń za creationix: master. pobrane prosto z repozytorium xtuple dla nvm
MrMesees
6
$ sudo bash -ic "nvm use stable; npm -v"
Now using node v6.3.1 (npm v3.10.3)
3.10.3
pmontrasio
źródło
4

Próbowałem tego samego na moim komputerze, na którym też mam nvmi mam trochę inną odpowiedź:

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

Domyślam się, że zainstalowałeś węzeł 0.11 poza nvm. ( Przez menedżera pakietów lub nawet ze źródła )

Dlatego uruchomienie węzła przez sudo spowoduje zamiast tego wybranie tego samodzielnego węzła.

Czy to ma sens, czy się mylę?

Aurélien Thieriot
źródło
Tak masz rację. Zainstalowałem node, a następnie nvm . Ale wszystko działa OK dla zwykłego użytkownika i nie działa dla roota.
Vitalii Korsakov
1
Och w porządku. Myślę więc, że nvm nie jest przeznaczone do uruchamiania jako root. W rzeczywistości jestem ładny, że bieganie w obszarze użytkownika jest pożądaną funkcją. Może to jednak pomóc: github.com/creationix/nvm/issues/5
Aurélien Thieriot
Ten facet najwyraźniej stworzył specjalne oprogramowanie NVM działające w trybie sudo: github.com/xtuple/nvm . Niestety tylko w trybie sudo. Nie wiem, czy to jest akceptowalne
Aurélien Thieriot
0

Zainstaluj nvm globalnie z
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | sudo bash

Ricky
źródło
creationix autorzy nvm, byłbym bardzo ostrożny w przypadku tego zewnętrznego NVM ...
MrMesees
4
Ta gałąź ma 12 zatwierdzeń do przodu, 1123 zatwierdzeń za creationix: master. To jest problem, usuń link
MrMesees
8
Ta odpowiedź sprawia, że ​​moje oczy krwawią. Po prostu nie powinieneś niczego pobierać i uruchamiać go w sudo bash, wtf
CharlyDelta
W rzeczywistości polecenie wget w dzisiejszych czasach kończy się | bash, nie ma nigdzie sudo: nvm-sh / nvm: Node Version Manager
Elise van Looij
0

Najłatwiejszym rozwiązaniem tego problemu będzie prawdopodobnie trafienie do pliku wykonywalnego nvm.sh, gdziekolwiek się on znajduje.

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

To działa dobrze dla mnie (zakładając, że jest to ścieżka instalacji).

Wyglądałaby jak pełna procedura instalacji

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"

A następnie możesz uruchomić powyższe polecenie, aby trafić do nowo zainstalowanego nvm.sh

swędzący kombinezon
źródło