简言之

首先,为什么npm建议它只能作为非根运行?我非常不相信其他所有的包管理器(aptyumgempacman)要求sudo是错误的.

其次,当我遵循他们的建议(并以非root用户的身份运行npm install)时,它将不起作用(因为非root用户无权访问/usr/local/lib).我如何听从他们的建议?我不会go 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,如果我听从他们的建议,那就行不通了.

这就引出了我上面最初的问题.

推荐答案

实际上,npm不建议以root身份运行.好了,不再是了.

在你提出问题的同时,情况发生了变化.这是2011年2月7日自述文件的样子:"Using sudo with npm is Very Not Recommended. Anyone can publish anything, and package installations can run arbitrary scripts."稍后将详细解释为"Option 4: HOLY COW NOT RECOMMENDED!! You can just use sudo all the time for everything, and ignore the incredibly obnoxious warnings telling you that you're insane for doing this."

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

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

Simple Install - To install npm with one command, do this:

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

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

我的建议是never do it,因为它基本上意味着:

  1. 找出本地DNS(或任何其他欺骗DNS响应或毒害DNS缓存的人)说的是NPMJ的IP地址.组织
  2. 使用端口80上的该IP(或任何自称是其IP的人)连接不安全的TCP
  3. 信任你认为应该与之交谈的路由(或任何给你DHCP响应的人说你应该与之交谈)将数据包传送到正确的主机
  4. 可能会通过另一层透明缓存代理
  5. 信任您和TCP连接的另一端之间的所有其他网络
  6. 不确定你和谁有联系
  7. 交叉你的手指
  8. 请求安装.不安全HTTP上的sh脚本,没有任何验证
  9. 然后在你的机器上以最大权限运行任何你正在与之交谈的人返回的内容,甚至不判断它是什么.

正如你所见,这是真的,毫不夸张地说,在通过与no verification whatsoever的不安全连接从互联网上请求脚本后,给出root shellwhatever you get.这里至少有5种情况可能会出错,其中任何一种都可能导致攻击者完全控制您的机器:

  1. DHCP欺骗
  2. ARP欺骗
  3. 域名服务器缓存污染
  4. DNS响应欺骗
  5. TCP会话劫持

还要注意的是,使用"sh"而不是"sudo sh"通常不会降低风险,除非您以无法访问您的私有数据的其他用户的身份运行它,通常情况并非如此.

如果可以下载这样的脚本,你应该使用HTTPS连接,这样你至少可以验证你在和谁说话,即使这样,我也不会在没有阅读之前运行它.不幸的是,NPMJ.org有一个自签名证书,所以在这种情况下它没有真正的帮助.

幸运的是,npm可以在GitHub上使用,它有一个有效的SSL证书,您可以使用安全连接从那里下载它.请看:github.com/isaacs/npm获取详细信息.但是要确保npm本身没有使用不安全的连接来下载它下载的文件——npm配置中应该有一个选项.

希望有帮助.祝你好运

Node.js相关问答推荐

如何更改ejs中的镜像src,以防从OMDB API获取的某些镜像具有src=N/A

自动将Selify打开的Chrome窗口移动到Mac OS中的第三个显示器

我的Node.js应用程序没有将Mongoose方法findByIdAndDelete作为函数进行检测

Socket.io 未将用户加入给定房间

使用单个 MongoDB 查询更新多个元素

为什么这个 module.export 函数如果我直接传递它就不起作用,但如果我将它包装在一个匿名函数中就可以工作

Axios 响应循环通过函数只返回第一个映射对象的结果

为什么 $or 在带有正则表达式的mongoose 中不能正常工作

部署云功能 Firebase/Stripe 时出错

如何在 TypeScript 中输出 Hackerrank 二叉树问题?

如何在 node.js 环境中从 WebAssembly (Rust) 调用异步 JavaScript 导入函数?

在 Javascript 逻辑中访问 EJS 变量

如何正确使用 package.json 中的关键字属性?

Nodejs-console.error vs util.debug

用于排除多个文件的 node.js glob 模式

在 express 中添加故意延迟

如何在 Node.js 中使用 chmod

代理后面的凉亭

nodejs - 如何读取和输出 jpg 图像?

将 Heroku App 连接到 Atlas MongoDB 云服务