Как / почему npm не рекомендует работать от имени root?


короче...

прежде всего, почему npm предположим,что он должен работать только как некорневой? Я очень не верю, что каждый другой менеджер пакетов (apt,yum,gem,pacman) не подходит для требования sudo.

во-вторых, когда я следую их предложение (и работать npm install как некорень), он не будет работать (потому что некорень не имеет разрешения на /usr/local/lib). Как я могу следовать их предложению? Я не собираюсь chown -R $USER /usr/local/lib, потому что мне кажется, это очень плохая идея.

полное описание...

Я установил npm через curl http://npmjs.org/install.sh | sudo sh (инструкция в их README).

когда я запускаю sudo npm install mongoose, НПМ говорит, что не надо запускать его от имени root:

npm ERR! sudon't!
npm ERR! sudon't! Running npm as root is not recommended!
npm ERR! sudon't! Seriously, don't do this!
npm ERR! sudon't!

но когда я запускаю npm install mongoose без sudo я получаю следующее:

npm info it worked if it ends with ok
npm info using npm@0.2.17
npm info using node@v0.4.0-pre
npm info fetch http://registry.npmjs.org/mongoose/-/mongoose-1.0.7.tgz
npm info calculating sha1 /tmp/npm-1297199132405/1297199132406-0.7044695958029479/tmp.tgz
npm info shasum b3573930a22066fbf3ab745a79329d5eae75b8ae
npm ERR! Could not create /usr/local/lib/node/.npm/.cache/mongoose/1.0.7/package.tgz
npm ERR! Failed creating the tarball.
npm ERR! This is very rare. Perhaps the 'gzip' or 'tar' configs
npm ERR! are set improperly?
npm ERR!
npm ERR! couldn't pack /tmp/npm-1297199132405/1297199132406-0.7044695958029479/contents/package to /usr/local/lib/node/.npm/.cache/mongoose/1.0.7/package.tgz
npm ERR! Error installing mongoose@1.0.7
npm ERR! Error: EACCES, Permission denied '/usr/local/lib/node/.npm/.cache/mongoose'
npm ERR! There appear to be some permission problems
npm ERR! See the section on 'Permission Errors' at
npm ERR!   http://github.com/isaacs/npm#readme
npm ERR! This will get better in the future, I promise.
npm not ok

поэтому он говорит мне, что я не должен использовать sudo, а затем не работает, если я следую их предложению.

что приводит к моей начальные вопросы выше.

3 53

3 ответа:

на самом деле, npm делает не не рекомендуется работать от имени root. Ну, уже нет.

Это изменилось примерно в то же время, что вы задали свой вопрос. Вот как выглядел README 7 февраля 2011 года: " использование sudo с npm очень не рекомендуется. Любой может опубликовать что угодно, а установки пакетов могут запускать произвольные сценарии." это было объяснено позже более подробно как "Вариант 4: святая корова не рекомендуется!! Вы можете просто использовать sudo все время для всего, и игнорируйте невероятно неприятные предупреждения, говорящие вам, что вы безумны для этого."

см.: https://github.com/isaacs/npm/tree/7288a137f3ea7fafc9d4e7d0001a8cd044d3a22e#readme

теперь это на самом деле считается рекомендовано техника установки НПМ:

простая установка-чтобы установить npm с помощью одной команды, выполните следующее:

curl http: / /npmjs.org/install.sh / sudo sh

см.: https://github.com/isaacs/npm/tree/99f804f43327c49ce045ae2c105995636c847145#readme

мой совет был бы никогда не потому что это означает, в основном это:

  1. узнайте, что говорит локальный DNS (или кто-либо еще, подделывающий ответ DNS или отравляющий кэш DNS), является IP-адресом npmjs.org
  2. подключение с небезопасным TCP с этим IP (или с тем, кто говорит, что это его IP) на порту 80
  3. доверяйте маршрутизатору, с которым вы думаете, что должны поговорить (или любой, кто дал вам ответ DHCP, сказал, что вы должны поговорить), чтобы доставить пакеты на правильный хост
  4. возможно пройти через другой слой прозрачного кэширования прокси
  5. доверяйте всем другим сетям между вами и другим концом TCP-соединения
  6. не знаю точно, с кем вы связаны
  7. крест свой пальцы
  8. запрос install.sh скрипт по небезопасному HTTP без какой-либо проверки
  9. а затем запустите все, что было возвращено тем, с кем вы разговариваете, с максимальными привилегиями на вашем компьютере, даже не проверяя, что это такое.

Как вы можете видеть, это действительно, буквально, без преувеличения давая корневой оболочки до все, что вы получите после запроса сценария из интернета по небезопасному соединению с никакой проверки. Есть по крайней мере 5 различных вещей, которые могут пойти не так здесь, любой из которых может привести к злоумышленнику, взяв полный контроль над вашей машиной:

  1. DHCP spoofing
  2. ARP spoofing
  3. отравление кэша DNS
  4. спуфинг ответа DNS
  5. TCP сессии угон

также обратите внимание, что использование 'sh' вместо 'sudo sh' обычно не менее рискованно, если вы не запустите его как другой пользователь, который не имеет доступа к вашим личным данным, что обычно не так.

вы должны использовать HTTPS-соединения, если они доступны для загрузки таких скриптов, чтобы вы могли хотя бы проверить, с кем вы разговариваете, и даже тогда я бы не запустил его, не прочитав сначала. К сожалению npmjs.org имеет самозаверяющий сертификат, поэтому он действительно не помогает в этом случае.

к счастью, npm доступен на GitHub, который имеет действительный сертификат SSL и откуда вы можете загрузите его с помощью безопасного соединения. См.: github.com/isaacs/npm для получения подробной информации. Но убедитесь, что сам npm не использует небезопасные соединения для загрузки загружаемых файлов - в конфигурации npm должна быть опция.

надеюсь, что это помогает. Удачи вам!

простой ответ-веб-серверы никогда не должны запускаться как root по известным причинам безопасности, поэтому это касается и команд npm.

чтобы начать заново, удалите предыдущий узел.js и npm устанавливает, а также эти файлы / каталоги:

mv ~/.npmrc       ~/.npmrc~prior
mv ~/.npm         ~/.npm~prior
mv ~/tmp          ~/tmp.~prior
mv ~/.npm-init.js ~/.npm-init.js~prior

Решение: Установить Узел.js (который поставляется с npm) как non root (no sudo)

скачать исходный код непосредственно из https://nodejs.org/en/download/

выполнить ниже как себя (Linux / OS X)

cd node-v8.1.2  # into expanded source dir

export NODE_PARENT=${HOME}/node-v8.1.2 # put this into your ~/.bashrc

не стесняйтесь изменять выше экспорт в любое место подходит

./configure   --prefix=${NODE_PARENT}
make -j4   # for dual core ... use  -j8  for quad core CPU
make install

который помещает двоичные файлы для узла.js и npm, а также его репозиторий модулей в $NODE_PARENT, $USER owned dir, который затем позволяет вам выдавать последующие команды npm install xxx как самостоятельно.

чтобы достичь двоичных файлов для node и npm, измените переменные среды PATH в своем ~/.bashrc следующее:

export PATH=${NODE_PARENT}/bin:${PATH}
export NODE_PATH=${NODE_PARENT}/lib/node_modules

затем установите пакеты в этот каталог (глобальный), в отличие от текущего каталога (локального) всегда передавайте флаг-g (глобальный):

npm install -g someModule

Примечание-ни в коем случае вы не выполняете ничего npm или узел, связанный как root / sudo.

еще одна причина для не установка пакетов NPM под root заключается в том, что это приведет к тому, что вы столкнетесь с проблемой доступа к файлам с пакетами, которые используют node-gyp (например: node-sass), потому что он строит библиотеки C++, а они не находятся в локальном .