Неможливо використовувати NVM з root (або sudo)


104

Я вже згадував, що мій додаток використовує іншу версію NodeJS при запуску з sudo.

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

Цей v0.11.8-pre викликав у мене деякі проблеми, тому я точно не хочу його використовувати, але я не можу змінити його на root.

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

Я намагався встановити nvm від root користувача, але отримав помилку "NVM вже встановлений", але все ще nvm не знайдено при запуску з sudo. У чому моя проблема?


3
Спробуйте sudo -s потім встановити nvm.
Ігри Brainiac

@GamesBrainiac Вибачте, але я написав, що намагався встановити його з root
Корсаков Віталій

спробуйте видалити /root/.nvm/ та перевстановіть nvm з нуля
Антоніо Е.

немає /root/.nvm. Я встановив nvm з sudo, і він був встановлений у звичайного користувача homedir
Корсаков Віталій

4
Це вирішує всю мою проблему, як у вас було github.com/xtuple/nvm
Yoo

Відповіді:


220

Нижче наведений список команд (джерело: digitalocean ), здається, вирішує проблему

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

Наведена вище команда є трохи складною, але все, що вона робить, - це скопіювати будь-яку версію вузла, у якої ви працюєте, через nvm, в /usr/local/каталог (де встановлені користувачем глобальні файли повинні жити на Linux VPS) та встановити дозволи, щоб усі користувачі могли отримати доступ до них .

Сподіваюся, це допомагає!


7
Дякую, мені це допомогло.
Вішал Кумар Верма

7
Дякую! Це врятувало мені багато часу
Квінтон Пайк

4
Ідеально! Дуже дякую.
Жан-Батист Луазель

2
Дивовижно! Минулої ночі я зруйнувавши всю свою систему RasPi 3, відчайдушно змінюючи дозволи на npm всюди, сьогодні я витратив 3 години на пошуки найкращого рішення для установки вузла / npm в усьому світі без необхідності sudo для кожного npm-дзвінка. Ваше рішення вдалося досягти
bosch

3
Це звучить як чудовий варіант, але я продовжую отримувати такі помилки: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

Моє рішення - створити символьні посилання з версій nodeі npmя використовую /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"

Це робить npmі nodeдоступним для всіх користувачів.


1
Прекрасне рішення. просто додайте "наприкінці другого рядка ... (я чомусь не міг це відредагувати)
Rayee Roded

1
Чудово, це, безумовно, найкраще рішення. Таким чином, root завжди буде використовувати ту саму версію npm / node, яку ви використовуєте для nvm користувача, дякую!
luiscvalmeida

3
Прекрасне рішення, але якщо ви зміните версію вузла, який ви використовуєте, вам доведеться повторно запустити вищезазначені команди.
door_number_three

4
Я використовую npxдосить часто. Так що я додав його , а також:sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npx" "/usr/local/bin/npx"
THOMAS

@SimpleJ, як би ти зробив те саме дляbabel-node
user566245

14

Ваша проблема полягає в тому, що nvmви не використовуєте цей шлях sudo.

Отже, наберіть

$ which nvm

і результат буде чимось на кшталт

/home/abc/mynvm/nvm

Повторіть спробу зараз sudo:

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

Я припускаю, що ви зіткнетеся з проблемою, що користувач root не може знайти версію 0.10.13, але дозволяє переглянути наступне повідомлення про помилку ...


42
which nvmВиходить нічого
Віталій Корсаков

6
він також не видає нічого для root
Віталій Корсаков

3
Проблема в тому, що я ніколи не входжу як root. Навіщо мені? Якщо мені потрібен кореневий доступ, я завжди використовую sudo. Так, я можу увійти як root та встановити nvm, але надалі я не міг запуститись sudo nvm use v0.10.25. Тому я також не міг користуватися sudo nodeкористувачем.
Віталій Корсаков

2
which nvmніколи не працює, чи не так? nvmне виконується, це функція оболонки. github.com/creationix/nvm/isissue/540
Метт

2
Нещодавно я задав подібне запитання щодо which nvmцього: stackoverflow.com/questions/49156104/… Використовуйте, type nvmщоб розкрити його визначення. Як сказав Метт, це функція оболонки.
Мартін Браун

13

Принципова причина тому, що nvmце не реальна програма. Це функція Баша , яка завантажується в користувача .profile, .bashrcабо ... Так що sudoне автоматичне забрати його з $ PATH , як і більшість інших програм.

Альтернативний менеджер версій вузла n: https://github.com/tj/n . Це справжня програма, тому ви sudoотримаєте її через $ PATH без жодних злому (до тих пір, поки sudoє /usr/local/binв її $ 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

Ідеально. Дякую "nvm - це не проблема, а функція bash" :)
ще

Ха-ха, щойно зрозумів про мою неправильну написання "проблема" замість "програми";).
ще

7

За інформацією README

Під час використання nvm вам не потрібно sudoглобально встановлювати модуль npm -g, тому замість цього sudo npm install -g gruntвиконайте замість цьогоnpm install -g grunt

Вам потрібен sudo npm?

У моєму випадку мені потрібен sudo npm run startдоступ до якогось файлу, який вимагає кореневого доступу. Відповідно до цього питання ,

Ви не використовуєте sudo. Натомість слід chmod / chown файл, щоб користувач, який має nvm, отримав доступ до файлу ;.

В результаті

Підтримувач nvm твердо вірить, що нам не потрібно sudo: P


6

У мене теж була ваша проблема. Нарешті я попрацював над цим. Ось моє рішення:

  1. Видаліть nvm та nodejs. Ось кілька корисних посилань: Видалення nvm . Якщо ви встановили nodejs за допомогою apt-get, ви можете видалити його за допомогою команди apt-get purge nodejs.
  2. Встановіть глобальний nvm. Дивіться цю сторінку: nvm global . Як говориться, "Стандартний nvm має відомі труднощі в роботі в багатокористувацьких або вкорінених середовищах".

Після перезавантаження терміналу ви можете запустити команду sudo nvm ls.


1
Ця гілка на 12 позицій попереду, 1123 передає за creationix: master. взяті прямо з репорта xtuple для nvm
MrMesees


4

Я спробував те ж саме на своїй машині, де у мене є nvm, і у мене є незначна реакція:

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

Я здогадуюсь, що ви встановили вузол 0.11 поза nvm. ( Через менеджера пакунків або навіть з джерела )

Тому запуск вузла через sudo замість цього візьме цей окремий вузол.

Це має сенс чи я помиляюся?


Так, ти маєш рацію. Я встановив вузол, а потім nvm . Але все працює нормально для нормального користувача і не працює для кореня.
Віталій Корсаков

1
Ой гаразд. Тоді я думаю, що nvm не призначений для запуску як root. Насправді я схожий на те, що біг у користувальницькій землі - це шукана функція. Однак це може допомогти вам: github.com/creationix/nvm/isissue/5
Aurélien Thieriot

Цей хлопець, мабуть, зробив спеціальний nvm, який працює в режимі sudo: github.com/xtuple/nvm . На жаль, лише в режимі судо. Я не знаю, чи прийнятно це
Aurélien Thieriot

0

Встановіть nvm глобально за допомогою
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | sudo bash


creationix авторів nvm, я б дуже обережно ставився до цього стороннього nvm ...
MrMesees

4
Ця гілка на 12 позицій попереду, 1123 передає за creationix: master. Це проблема, видаліть посилання
MrMesees

8
Ця відповідь змушує мої очі кровоточити. Ви просто не повинні нічого завантажувати і запускати його в
судо-басі

Насправді команда wget в ці дні закінчується | bash, нікуди не судо
Elise van Looij

0

Найпростішим рішенням цього, швидше за все, буде просто натиснути виконуваний файл nvm.sh де б він не був.

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

Це добре працює для мене (якщо припустити, що це шлях встановлення).

Повна процедура установки виглядала б так

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"

І тоді ви можете запустити команду вище, щоб потрапити на нещодавно встановлений nvm.sh

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.