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?


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!


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.


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 ...


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

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


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.


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

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ę?


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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.