npm如何/为什么不推荐以root身份运行?
简而言之…
首先,为什么npmbuild议它只能以非root用户身份运行? 我非常不相信所有其他的软件包pipe理者( apt
, yum
, gem
, pacman
)对于要求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议是永远不要这样做,因为它基本上是这样的:
- 找出本地DNS(或其他欺骗DNS响应或中毒DNScaching的人)所说的是npmjs.org的IP地址
- 在端口80上连接带有该IP的不安全的TCP(或与谁说的是他的IP)
- 请相信您认为应该与之交谈的路由器(或者任何向您提供DHCP响应的人员表示您应该与之通话),以便将数据包传送到正确的主机
- 可能会经过另一层透明caching代理
- 信任您和TCP连接的另一端之间的所有其他networking
- 不知道你与谁连接
- 交叉你的手指
- 通过不安全的HTTP请求install.sh脚本,无需validation
- 然后以最大权限在您的机器上运行无论您正在与谁交谈的任何内容,而无需检查它是什么。
正如你所看到的那样,从字面上看,在不需要validation的情况下 ,通过不安全的连接从因特网索要脚本之后, 根本不会夸大root shell 。 至less有5种不同的东西可以出错,其中任何一种都可能导致攻击者完全控制你的机器:
- DHCP欺骗
- ARP欺骗
- DNScaching中毒
- DNS响应欺骗
- 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或节点。