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

2024-01-03

简而言之...

首先,为什么npm http://npmjs.org/建议它只能以非 root 身份运行?我非常不相信其他所有包管理器(apt, yum, gem, pacman) 要求 sudo 是错误的。

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

详细描述...

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

当我跑步时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 [email protected] /cdn-cgi/l/email-protection
npm info using [email protected] /cdn-cgi/l/email-protection
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 [email protected] /cdn-cgi/l/email-protection
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 确实not建议不要以 root 身份运行。好吧,不再是了。

它大约在您提出问题的同时发生了变化。 2011 年 2 月 7 日的自述文件如下所示:“非常不推荐将 sudo 与 npm 一起使用。任何人都可以发布任何内容,并且包安装可以运行任意脚本。”稍后更详细地解释为“选项 4:天哪,不推荐!!你可以一直使用 sudo 来完成所有事情,而忽略那些令人讨厌的警告,告诉你这样做是疯了。”

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

现在它实际上被认为是受到推崇的安装npm的技巧:

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

卷曲http://npmjs.org/install.sh |须藤 sh

See: https://github.com/isaacs/npm/tree/99f804f43327c49ce045ae2c105995636c847145#readme 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. 然后在你的机器上以最大权限运行与你交谈的人返回的任何内容,甚至不检查它是什么。

正如你所看到的,这确实是字面上的意思,毫不夸张根外壳 to 无论你得到什么通过不安全的连接从互联网请求脚本后没有任何验证。这里至少有 5 个不同的地方可能会出现问题,其中任何一个都可能导致攻击者完全控制您的机器:

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

另请注意,使用“sh”而不是“sudo sh”的风险通常不会降低,除非您以无权访问您的私人数据的其他用户身份运行它,但通常情况并非如此。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

npm 如何/为什么建议不要以 root 身份运行? 的相关文章

随机推荐

  • 使用 simctl 运行 XCTest 包

    我有一个 XCTest 包 我可以使用它在模拟器上通过 xcode 运行simctl 我使用的是 iPhone 6 iOS 9 1 模拟器 环境变量如下 export SIMCTL CHILD TestBundleLocation User
  • Knockout - 被点击的元素

    我有以下标记 fieldset div div fieldset
  • 如何将两个整数相除以获得双精度数?

    如何将两个整数相除以获得双精度数 您想要投射数字 double num3 double num1 double num2 注意 如果 C 中的任何参数是double a double使用除法 结果是double 因此 以下内容也可以工作 d
  • Python将变量视为文字/原始字符串[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我不敢相信治疗如此困难variable as a 原始字符串 我搜索并发现了类似的问题 但没有正确的答案 我有一个带有存储域名的变量 do
  • GMA 500 集成显卡上的 WPF 性能缓慢

    我的团队正在开发要部署在 Intel Atom Z530 上网本硬件平台上的 WPF 应用程序 Intel Atom Z530 配备 Intel GMA 500 集成显卡 具有 PowerVR SGX 535 GPU 核心 PowerVR
  • 射线与平面的交点坐标

    我有一条射线和一架飞机 射线与平面相交 我想知道在哪里 如何获得该交点的世界坐标 我的特殊情况是 我将屏幕坐标取消投影到相机并创建光线 该平面是场景的地面 var vector new THREE Vector3 mousePosition
  • 如何在不刷新整个页面的情况下让 Grunt/Watch/LiveReload 重新加载 Sass/CSS?

    到目前为止 我已经让一切按照我想要的方式工作 即监视我想要的所有文件并在发生更改时刷新 除了我希望能够对 Sass CSS 进行修改并刷新它在没有页面加载的浏览器中 这不是什么大问题 但有时我会在进行一些页面交互后尝试修改某些内容的样式 并
  • 使用“data.table”根据变量获取子组的第一个

    考虑一个由分组变量组成的数据集 这里id 和一个有序变量 这里date df lt data frame id rep 1 2 2 date 4 1 id date 1 1 4 2 2 3 3 1 2 4 2 1 我想知道最简单的方法是什么
  • iPhone Web App - 在 iOS8 中停止身体弹跳/滚动

    是的 我知道 这个问题之前已经被问过一千次了 感谢你们所有人 我终于找到了一个解决方案 最终在 更新到 iOS 8 后 似乎没有任何效果 iOS7 中最适合我的是什么 Css html body scrollable overflow au
  • mysql中选择部分表列数据

    我有一个包含 2000 个条目的 照片 表 该表有一列名为photo note其中包含以下格式但具有不同放大值的数据 Magnification 30x The resolution varies depending on 我需要选择以 分
  • CTE(通用表表达式)与临时表或表变量,哪个更快?

    CTE 通用表表达式 与Temp tables or Table variables 哪个更快 正如我在评论中已经说过的 这取决于 它确实取决于您的查询 您的数据 有多少 它是什么类型 等等 不过 需要记住一些要点 CTE 是仅对下一条语句
  • 编译 jitsi 项目时,转换为 Dalvik 格式失败,出现错误 1

    我正在尝试编译并运行该项目https github com jitsi jitsi android https github com jitsi jitsi android在 Eclipse 上通过导入 我已成功导入项目 添加了外部 Jar
  • Shopify 结账中的脚本标签

    我正在考虑为 Shopify 开发一款应用程序 该应用程序将为商店的结帐页面添加功能 如果用户不必将代码复制并粘贴到文件中 那将是理想的选择 因此我正在考虑使用 ScriptTag API http api shopify com scri
  • 为什么内部调用内的 lapply 与内部调用内的变量赋值不同?

    考虑 notBroken lt within mtcars gear lt as factor gear cyl lt as factor cyl str notBroken 我们的输出 gt str notBroken data fram
  • 将 SQL 中的 CASE 表达式转换为 SSIS 中的派生列 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions CASE WHEN CHARINDE
  • 禁用 Cypress 自动滚动

    我正在测试我的应用程序 我有很长的侧边菜单 并且我有这样的代码 cy get tab click force true 自动滚动发生在获取和单击之间 然后选定的选项卡不可见 因为顶部菜单的位置已固定 我找到了很多解决方案 但没有一个有效 到
  • 如何在 Swift iOS 应用程序中添加 Google Drive API?

    我有一个用 Swift 编写的应用程序 它已经使用了 SwiftyDropbox API 我用 cocoapods 安装了 SwiftyDropbox use frameworks 关键词 现在 当我添加这个 pod 时 Google AP
  • 在 WooCommerce 3+ 中向订单添加自定义字段

    在 WooCommerce 中 我想添加一个新的自定义字段来订单详细信息 现在我可以使用下面的代码创建一个新的自定义字段 referenceNumber 并在其中添加 ordercreated 值 update post meta orde
  • SpriteKit场景切换时的内存问题

    Ok so awhile back in testing I had a random crash with no error and I have no clue why So i went into analyze things and
  • npm 如何/为什么建议不要以 root 身份运行?

    简而言之 首先 为什么npm http npmjs org 建议它只能以非 root 身份运行 我非常不相信其他所有包管理器 apt yum gem pacman 要求 sudo 是错误的 其次 当我遵循他们的建议 并运行npm insta