首先,为什么npm表明它应该只作为非root运行?我非常不相信每个其他包管理器(apt
,yum
,gem
,pacman
)都不适合要求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,然后如果我按照他们的建议就行不通。
这导致我上面的初步问题。
答案 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
我的建议是从不这样做,因为它基本上意味着:
正如你所看到的那样,从字面上看,在通过不安全的连接从互联网上请求脚本后,毫不夸张地将 root shell 提供给 无需验证。这里至少有5种不同的东西可能出错,其中任何一种都可能导致攻击者完全控制你的机器:
另请注意,使用'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)
文件夹中。