Linux 下 Claude Code 安装与更新指南

Claude Code 简介

Claude Code 是 Anthropic 推出的命令行 AI 编程助手,基于 Claude 大模型,能在终端中直接进行代码编写、调试、重构等操作。支持多文件编辑、Git 集成、Shell 命令执行,是开发者的效率利器。

官方推荐通过 npm 安装,但国内网络环境下 npm 下载 GitHub 资源经常超时。本文介绍一种更可靠的方式:通过淘宝 npm 镜像下载预编译包,绕过网络限制,实现快速安装与更新。

方法一:npm 安装(官方方式)

最简单的方式是通过 npm 全局安装:

npm install -g @anthropic-ai/claude-code

安装完成后直接使用:

claude

注意:npm 安装过程会从 GitHub 下载预编译二进制文件,国内网络可能超时。如果遇到网络问题,推荐使用下面的方法二。

方法二:预编译包手动安装(推荐国内用户)

Claude Code 的 npm 包 @anthropic-ai/claude-code 实际上是 JS wrapper,真正的二进制文件在平台特定的包里。Linux x64 对应的包名为 @anthropic-ai/claude-code-linux-x64

下载与安装

通过淘宝 npm 镜像下载预编译包:

# 获取最新版本号
VERSION=$(curl -sf https://registry.npmmirror.com/@anthropic-ai/claude-code-linux-x64 \
  | python3 -c "import sys,json;print(json.load(sys.stdin)['dist-tags']['latest'])")

echo "Latest version: $VERSION"

# 下载 tarball
curl -fSL -o claude.tgz \
  "https://registry.npmmirror.com/@anthropic-ai/claude-code-linux-x64/-/claude-code-linux-x64-${VERSION}.tgz"

# 解压到安装目录
INSTALL_DIR="$HOME/.local/share/claude/versions/$VERSION"
mkdir -p "$INSTALL_DIR"
tar xzf claude.tgz -C "$INSTALL_DIR"
rm claude.tgz

# 创建符号链接
mkdir -p "$HOME/.local/bin"
ln -sfn "$INSTALL_DIR/package/claude" "$HOME/.local/bin/claude"

# 验证
claude --version

这种方式的优点:

  • 速度快:淘宝镜像 CDN 在国内下载速度可达 10MB/s+
  • 离线可用:下载的 tarball 可以离线安装
  • 多版本共存:每个版本独立目录,方便回滚

更新

更新只需重复上述步骤,下载新版本后更新符号链接即可。旧版本目录可保留作为回滚:

# 查看当前版本
claude --version

# 按上面的步骤下载新版本,符号链接会自动指向新版本

# 如需回滚到旧版本
ln -sfn "$HOME/.local/share/claude/versions/2.1.165/package/claude" "$HOME/.local/bin/claude"

自动化升级脚本

如果经常需要更新,可以写一个升级脚本自动完成上述流程。以下是完整的脚本:

#!/usr/bin/env python3
"""Claude Code upgrade via Taobao npm mirror.

Downloads prebuilt @anthropic-ai/claude-code-linux-x64 tarball from
registry.npmmirror.com and installs to ~/.local/share/claude/versions/.

Output:
  NOOP v{version}          — already up-to-date
  UPGRADED v{old} → v{new} — upgrade successful
"""

import os
import re
import subprocess
import sys
import tarfile
import tempfile
from pathlib import Path
from urllib.parse import quote

NPM_REGISTRY = "https://registry.npmmirror.com"
PACKAGE_NAME = "@anthropic-ai/claude-code-linux-x64"
VERSIONS_DIR = Path.home() / ".local" / "share" / "claude" / "versions"
BIN_LINK = Path.home() / ".local" / "bin" / "claude"


def run(cmd: str, timeout: int = 30) -> subprocess.CompletedProcess:
    return subprocess.run(
        cmd, shell=True, capture_output=True, text=True, timeout=timeout
    )


def get_current_version() -> str:
    r = run(f"{BIN_LINK} --version 2>&1", timeout=10)
    m = re.search(r"([\d.]+)", r.stdout.strip())
    return m.group(1) if m else "unknown"


def get_latest_version() -> str | None:
    encoded = quote(PACKAGE_NAME, safe="")
    r = run(
        f'curl -sf "{NPM_REGISTRY}/{encoded}" 2>&1 | '
        f"python3 -c \"import sys,json;print(json.load(sys.stdin)['dist-tags']['latest'])\"",
        timeout=15,
    )
    ver = r.stdout.strip()
    return ver if re.match(r"^\d+\.\d+\.\d+$", ver) else None


def download_and_install(version: str) -> bool:
    tarball_name = "claude-code-linux-x64" + f"-{version}.tgz"
    url = f"{NPM_REGISTRY}/{PACKAGE_NAME}/-/{tarball_name}"
    dest = VERSIONS_DIR / version
    dest.mkdir(parents=True, exist_ok=True)

    with tempfile.NamedTemporaryFile(suffix=".tgz", delete=False) as tmp:
        tmp_path = tmp.name

    try:
        r = run(f'curl -fSL -o "{tmp_path}" "{url}"', timeout=120)
        if r.returncode != 0:
            print(f"DOWNLOAD_FAILED {r.stderr.strip() or r.stdout.strip()}")
            return False

        size_mb = os.path.getsize(tmp_path) / 1024 / 1024
        print(f"  Downloaded {size_mb:.1f} MB")

        with tarfile.open(tmp_path, "r:gz") as tf:
            tf.extractall(dest, filter="data")

        binary = dest / "package" / "claude"
        if not binary.exists():
            print("BINARY_NOT_FOUND")
            return False

        binary.chmod(0o755)
        BIN_LINK.unlink(missing_ok=True)
        BIN_LINK.symlink_to(binary)

        return True
    finally:
        os.unlink(tmp_path)


def cleanup_old_versions(current: str) -> None:
    """Remove old version directories."""
    for d in VERSIONS_DIR.iterdir():
        if d.is_dir() and d.name != current:
            import shutil

            shutil.rmtree(d, ignore_errors=True)


def main() -> None:
    print("⬆ Claude Code Upgrade")
    print()

    old_ver = get_current_version()
    latest = get_latest_version()

    if not latest:
        print("FAILED cannot determine latest version")
        sys.exit(1)

    print(f"  Current:  v{old_ver}")
    print(f"  Latest:   v{latest}")
    print()

    if old_ver == latest:
        print(f"NOOP v{latest}")
        return

    print("  Downloading from npm mirror...")
    if download_and_install(latest):
        cleanup_old_versions(latest)
        print(f"UPGRADED v{old_ver} → v{latest}")
    else:
        print("FAILED download/install error")
        sys.exit(1)


if __name__ == "__main__":
    main()

将脚本保存为 claude_upgrade.py,每次更新只需运行:

python3 claude_upgrade.py

脚本的主要特性:

  • URL 编码处理:使用 urllib.parse.quote 正确编码包名中的 @/,避免镜像 API 请求失败
  • 错误处理:下载失败或二进制文件缺失时会输出明确的错误信息
  • 旧版本清理:升级成功后自动删除旧版本目录,节省磁盘空间
  • 幂等执行:已是最新版本时输出 NOOP,不会重复下载

对于国内 Linux 用户,推荐使用淘宝 npm 镜像下载预编译包的方式,兼顾速度和可靠性。配合自动化脚本,更新体验与 npm 方式一样便捷。