You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何不通过curl | bash方式安装npm?

如何不通过curl | bash方式安装npm?

确实,直接用curl | bash(尤其是以root权限运行)这种操作风险极高——就像你说的,这相当于把系统的最高权限交给了一堆你没法完全掌控的环节:从脚本的开发者、托管域名的服务商,到传输过程中的各个节点,任何一个环节出问题,你的系统都可能被意外接管,这在过去真的和“被入侵”没两样。

下面给你几个更安全、更透明的替代方案:

方案1:通过系统包管理器手动配置源安装

如果是Debian/Ubuntu这类基于APT的系统,完全可以跳过自动脚本,手动完成源配置:

  • 如果能接受官方源里的稳定(可能不是最新)版本,直接安装即可:
    sudo apt update
    sudo apt install nodejs npm
    
  • 想要更新版本的话,手动添加Nodesource源的步骤如下:
    1. 先手动导入并验证Nodesource的GPG密钥,确保源的合法性:
      curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/nodesource.gpg
      
    2. 手动创建源列表文件(以Node.js 20.x为例):
      echo "deb [signed-by=/etc/apt/trusted.gpg.d/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
      
    3. 最后更新包列表并安装:
      sudo apt update
      sudo apt install nodejs
      
    这种方式你能清楚知道自己添加了什么源,密钥也经过了手动验证,比盲目跑脚本透明得多。

方案2:使用版本管理器(如nvm)在用户级安装

nvm(Node Version Manager)可以让你在用户目录下安装Node.js和npm,不需要root权限,就算出问题也不会影响整个系统:

  • 先下载安装脚本到本地,一定要先检查脚本内容再运行
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh > nvm-install.sh
    
  • 用文本编辑器打开nvm-install.sh,仔细检查每一行代码,确认没有恶意操作。
  • 确认安全后再运行脚本:
    bash nvm-install.sh
    
  • 重启终端后,就可以用nvm安装Node.js(自带npm)了:
    nvm install 20
    
    这种方式的风险远低于root级的脚本执行,因为它只影响当前用户的环境。

方案3:手动下载二进制包并配置环境变量

这是最安全的方式,完全由你掌控每一步:

  1. 下载对应系统的Node.js二进制压缩包(以Linux x64的20.10.0版本为例):
    curl -O https://nodejs.org/dist/v20.10.0/node-v20.10.0-linux-x64.tar.xz
    
  2. 解压到用户目录下的自定义位置,比如~/.local/node
    mkdir -p ~/.local/node
    tar -xJf node-v20.10.0-linux-x64.tar.xz -C ~/.local/node --strip-components=1
    
  3. 把Node.js的bin目录添加到PATH环境变量中,编辑你的shell配置文件(比如~/.bashrc~/.zshrc):
    echo 'export PATH="$HOME/.local/node/bin:$PATH"' >> ~/.bashrc
    
  4. 刷新环境变量使修改生效:
    source ~/.bashrc
    
    这种方式没有任何自动执行的未知脚本,所有操作都由你手动完成,安全性拉满,就是步骤稍微繁琐一点。

补充一句:正如你提到的,curl | bash这种盲信脚本的行为,本质上是把系统安全托付给了第三方,甚至是整个传输链路中的所有节点——你无法确认脚本在传输过程中有没有被篡改,也没法提前知道脚本会执行哪些操作,所以能不用就尽量不用。

内容的提问来源于stack exchange,提问作者William Entriken

火山引擎 最新活动