Невозможно использовать NVM из root (или sudo)

106

Я уже упоминал, что мое приложение использует другую версию 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.
Games Brainiac
@GamesBrainiac Извините, но я написал, что пытался установить его из root
Виталий Корсаков
попробуйте удалить /root/.nvm/ и переустановить nvm с нуля
Антонио Э.
нет /root/.nvm. Я установил nvm из sudo, и он был установлен обычным пользователем homedir
Виталий Корсаков
4
Это решает все мои проблемы, как и у вас github.com/xtuple/nvm
Ю Мацуо

Ответы:

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 часа на поиск лучшего решения для глобальной установки node / 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
131

Мое решение создать символические ссылки из версий , 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доступным для всех пользователей.

SimpleJ
источник
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
15

Ваша проблема в том, что nvmэто не на пути, когда вы используете sudo.

Так что типа

$ which nvm

и результат будет примерно таким

/home/abc/mynvm/nvm

Повторите попытку сейчас sudo:

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

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

CFrei
источник
42
which nvmничего не выводит
Виталий Корсаков
6
для root тоже ничего не выводит
Виталий Корсаков
3
Проблема в том, что я никогда не вхожу в систему как root. Почему я должен? Если мне нужен root-доступ, я всегда использую sudo. Да, я могу войти в систему как root и установить nvm, но в будущем я не мог работать sudo nvm use v0.10.25. Так что я тоже не мог использовать sudo nodeот пользователя.
Виталий Корсаков
2
which nvmникогда не работает, не так ли? nvmне исполняемый файл, это функция оболочки. github.com/creationix/nvm/issues/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
Wisbucky
источник
Отлично. Спасибо "nvm это не проблема, а функция bash" :)
еще
Ха-ха, только что понял, что у меня неправильно написано "проблема" вместо "программа";).
еще
8

Согласно README

При использовании nvm вам не нужно sudoглобально устанавливать модуль с помощью npm -g, поэтому вместо этого sudo npm install -g gruntвыполнитеnpm install -g grunt

Нужен sudo npm?

В моем случае мне нужен sudo npm run startдоступ к какому-то файлу, требующему root-доступа. Согласно этому вопросу ,

Вы не используете sudo. Вместо этого вы должны выполнить команду chmod / chown для файла, чтобы пользователь, имеющий nvm, имел доступ к файлу ;.

В сумме

Сопровождающий nvm твердо уверен, что нам не нужно sudo: P

lzl124631x
источник
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 08
6
$ sudo bash -ic "nvm use stable; npm -v"
Now using node v6.3.1 (npm v3.10.3)
3.10.3
pmontrasio
источник
4

Я пробовал то же самое на своей машине, nvmи у меня есть немного другой ответ:

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

Я предполагаю, что вы установили узел 0.11 вне nvm. ( Через диспетчер пакетов или даже из источника )

Следовательно, запуск node через sudo вместо этого выберет этот автономный узел.

В этом есть смысл или я ошибаюсь?

Орельен Тьерио
источник
Да ты прав. Я установил узел, а затем nvm . Но у обычного пользователя все работает нормально, а для рута не работает.
Виталий Корсаков
1
Ну ладно. Тогда я думаю, что nvm не предназначен для запуска с правами root. На самом деле я доволен тем, что работа в пользовательской среде - это желанная функция. Однако это может вам помочь: github.com/creationix/nvm/issues/5
Aurélien Thieriot
Этот парень, по-видимому, создал специальный nvm, работающий в режиме sudo: github.com/xtuple/nvm . К сожалению, только в режиме sudo. Я не знаю, приемлемо ли это,
Орельен Тьерио
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 08
8
От этого ответа у меня кровоточат глаза. Вы просто не должны ничего скачивать и запускать в sudo bash, wtf
CharlyDelta
Фактически, команда wget в наши дни заканчивается | bash, sudo нигде нет: nvm-sh / nvm: Node Version Manager
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

зуд
источник