npm如何/为什么建议不以root身份运行?

时间:2011-02-08 21:21:11

标签: node.js npm

简而言之......

首先,为什么npm表明它应该只作为非root运行?我非常不相信每个其他包管理器(aptyumgempacman)都不适合要求sudo。

其次,当我按照他们的建议(并将npm install作为非root用户运行)时,它将无效(因为非root用户没有/ usr / local / lib的权限)。我如何遵循他们的建议?我不打算chown -R $USER /usr/local/lib,因为这对我来说似乎是一个非常糟糕的主意。

完整描述......

我通过curl http://npmjs.org/install.sh | sudo sh(自述文件中的说明)安装了npm

当我运行sudo npm install mongoose时,npm告诉我不要以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!

但是当我在没有sudo的情况下运行npm install mongoose时,我得到以下内容:

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 个答案:

答案 0 :(得分:50)

实际上,npm 建议不要以root用户身份运行。好了,不再了。

它在您提出问题的同时发生了变化。这就是自述文件在2011年2月7日的样子:“非常不推荐使用带有npm的sudo。任何人都可以发布任何内容,并且软件包安装可以运行任意脚本。”稍后将对此进行解释。详细信息为“选项4:我不推荐!!你可以一直使用sudo来做所有事情,而忽略了令人难以置信的令人讨厌的警告,告诉你这样做是疯了。”

请参阅:https://github.com/isaacs/npm/tree/7288a137f3ea7fafc9d4e7d0001a8cd044d3a22e#readme

现在它实际上被认为是安装npm的推荐技术:

  

简单安装 - 要使用一个命令安装npm,请执行以下操作:

     

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

请参阅:https://github.com/isaacs/npm/tree/99f804f43327c49ce045ae2c105995636c847145#readme

我的建议是从不这样做,因为它基本上意味着:

  1. 找出本地DNS(或任何欺骗DNS响应或中毒DNS缓存的人)说的是npmjs.org的IP地址
  2. 在端口80上连接不安全的TCP与该IP(或与谁说是他的IP)
  3. 信任您认为应与之交谈的路由器(或任何向您提供DHCP响应的人说您应该与之交谈)将数据包传送到正确的主机
  4. 可能会通过另一层透明缓存代理
  5. 信任您与TCP连接另一端之间的所有其他网络
  6. 不确定您与谁有联系
  7. 交叉手指
  8. 在不安全的HTTP上请求install.sh脚本,无需任何验证
  9. 然后运行您正在与之交谈的任何人返回的任何内容,并且无需检查它是什么。
  10. 正如你所看到的那样,从字面上看,在通过不安全的连接从互联网上请求脚本后,毫不夸张地将 root shell 提供给 无需验证。这里至少有5种不同的东西可能出错,其中任何一种都可能导致攻击者完全控制你的机器:

    1. DHCP欺骗
    2. ARP欺骗
    3. DNS缓存中毒
    4. DNS响应欺骗
    5. TCP会话劫持
    6. 另请注意,使用'sh'而不是'sudo sh'通常风险不大,除非您将其作为无法访问您的私人数据的其他用户运行,这通常不是这种情况。

      如果可以下载此类脚本,您应该使用HTTPS连接,这样您至少可以验证您正在与谁通话,即使这样,我也不会在没有先阅读的情况下运行它。不幸的是,npmjs.org有一个自签名证书,所以在这种情况下它并没有真正帮助。

      幸运的是,npm在GitHub上可用,它具有有效的SSL证书,您可以使用安全连接从中下载它。有关详细信息,请参阅:github.com/isaacs/npm。但请确保npm本身不使用不安全的连接来下载它下载的文件 - 在npm config中应该有一个选项。

      希望它有所帮助。祝你好运!

答案 1 :(得分:20)

简单的答案是,出于众所周知的安全原因,Web服务器永远不应该以root用户身份运行,因此这也适用于npm命令。

要重新开始,请删除之前的Node.js和npm安装以及这些文件/目录:

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

解决方案:将Node.js(随npm一起提供)安装为NON root(无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

将Node.js和npm的二进制文件及其模块存储库放入$ NODE_PARENT,$ USER拥有的dir,然后允许您自己发出后续的npm install xxx命令。

要获取node和npm的二进制文件,请更改〜/ .bashrc中的PATH环境变量:

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

然后将包安装到该目录(全局),而不是当前目录(本地),总是传入-g标志(全局):

npm install -g someModule

注意 - 您从未执行任何npm或与root / sudo相关的节点。

答案 2 :(得分:2)

在根目录下安装NPM软件包的另一个原因是,它会导致您使用node-gyp(例如:node-sass)的软件包遇到文件访问问题,因为它会构建C ++库并且不在本地df[bb_high] = df.loc[:, columnNames[sma_iter]] + (rolling_std * 2) df[bb_low] = df.loc[:, columnNames[sma_iter]] - (rolling_std * 2) 文件夹中。