npm如何/为什么不推荐以root身份运行?

简而言之…

首先,为什么npmbuild议它只能以非root用户身份运行? 我非常不相信所有其他的软件包pipe理者( aptyumgempacman )对于要求sudo是错误的。

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

详细描述…

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

当我运行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! 

但是当我运行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,如果我遵循他们的build议,则不起作用。

这导致我上面的最初的问题。

实际上,npm不build议不以root身份运行。 那么,不再有了。

它在你问你问题的同时发生了变化。 这是自述文件2011年2月7日的样子: “使用npm与npm是非常不推荐的,任何人都可以发布任何东西,包安装可以运行任意脚本。 后面更详细地解释为: “选项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

我的build议是永远不要这样做,因为它基本上是这样的:

  1. 找出本地DNS(或其他欺骗DNS响应或中毒DNScaching的人)所说的是npmjs.org的IP地址
  2. 在端口80上连接带有该IP的不安全的TCP(或与谁说的是他的IP)
  3. 请相信您认为应该与之交谈的路由器(或者任何向您提供DHCP响应的人员表示您应该与之通话),以便将数据包传送到正确的主机
  4. 可能会经过另一层透明caching代理
  5. 信任您和TCP连接的另一端之间的所有其他networking
  6. 不知道你与谁连接
  7. 交叉你的手指
  8. 通过不安全的HTTP请求install.sh脚本,无需validation
  9. 然后以最大权限在您的机器上运行无论您正在与谁交谈的任何内容,而无需检查它是什么。

正如你所看到的那样,从字面上看,在不需要validation的情况下 ,通过不安全的连接从因特网索要脚本之后, 根本不会夸大root shell 。 至less有5种不同的东西可以出错,其中任何一种都可能导致攻击者完全控制你的机器:

  1. DHCP欺骗
  2. ARP欺骗
  3. DNScaching中毒
  4. DNS响应欺骗
  5. TCP会话劫持

另外请注意,使用'sh'而不是'sudo sh'通常不会有什么风险,除非您将其作为不能访问您的私人数据的其他用户来运行(通常情况并非如此)。

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

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

希望能帮助到你。 祝你好运!

简单的答案是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 

解决scheme:将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环境variables:

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

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

 npm install -g someModule 

注意 – 你没有时间执行任何与root / sudo相关的npm或节点。