Atuin:29,794 GitHub Stars — Shell 历史同步设置指南 2026

Atuin 用 SQLite 数据库替代 shell 历史,记录命令上下文(退出码、cwd、时长),跨机器同步加密历史。支持 Bash、Zsh、Fish、Nushell。涵盖安装、自托管、配置和 Atuin vs mcfly vs fzf vs Hstr。

  • ⭐ 30464
  • 更新于 2026-05-19

Atuin Shell 历史

Atuin 用 SQLite 数据库替代现有 shell 历史,通过 Ctrl+R 激活全屏模糊搜索 UI。

Atuin 统计

atuin stats 命令显示你最常用命令、总命令数、独特命令细分。

引言 #

你这周至少敲了三次那个复杂 kubectl 命令。你知道它在历史某处——可能埋在 40,000 其他命令下——但 Ctrl+R 反向搜索一次循环一个匹配,grep ~/.bash_history 返回一堵噪声墙。对终端生活的开发者,shell 历史是第二记忆。当它失败,生产力下降。

Atuin 用 SQLite 支持历史数据库解决此问题,不仅记录命令,还有上下文:退出码、工作目录、主机名、会话 ID、时长。29,794 GitHub stars + Rust 代码库,Atuin 给每个 shell 会话添加模糊搜索、加密跨机器同步和使用分析。本指南带你走过生产级 Atuin 安装,从首命令到自托管同步服务器。无论你需单笔记本还是开发者工作站舰队 atuin 安装说明,下面步骤复制粘贴就绪。

不同于传统 shell 历史追加命令到平面文本文件(~/.bash_history~/.zsh_history),Atuin 将每个命令存储为带 12+ 字段的结构化记录。这启用 grep 不可能的查询:“显示我所有在 /project/api 下午 6 点后运行的失败命令"或"上周二在 staging 服务器跑的那个 docker 命令是什么?“下面 atuin 教程覆盖从安装到日常 workflow 集成每一步。

什么是 Atuin? #

Atuin 是用 Rust 编写的 shell 历史替换工具,将命令存储在本地 SQLite 数据库带丰富元数据,然后通过端到端加密可选跨机器同步历史。MIT 许可证发布由 atuinsh 组织维护,支持 Bash、Zsh、Fish、Nushell、Xonsh、PowerShell(第 2 级)。

Atuin 如何工作 #

Atuin 作为客户端侧历史拦截器和可选同步客户端运行。理解架构在调试同步问题或规划自托管部署时有帮助。

架构概览 #

+-------------+     preexec/precmd hooks     +------------------+
|   Shell     |  -------------------------->  |   Atuin Client   |
| (bash/zsh)  |                             |   (Rust binary)  |
+-------------+                             +--------+---------+
                                                     |
                                            +--------v---------+
                                            |   SQLite (local) |
                                            |   ~/.local/share |
                                            +--------+---------+
                                                     |
                              +----------------------v----------------------+
                              |              Sync Protocol V2                |
                              |   PASETO V4 (XChaCha20-Poly1305 + Blake2b) |
                              +----------------------+----------------------+
                                                     |
                              +----------------------v----------------------+
                              |         Atuin Server (self-hosted or cloud)  |
                              |         PostgreSQL 或 SQLite 后端          |
                              +---------------------------------------------+

核心组件 #

  1. Shell Hook 层:Atuin 通过 shell 特定插件注册 preexec(命令前)和 precmd(命令后)hooks。捕获命令字符串、工作目录、开始时间、退出码。
  2. 本地 SQLite 数据库:所有历史存储在 ~/.local/share/atuin/history.db 用 SQLite WAL 模式并发读写性能。
  3. 同步客户端:可选后台同步推加密记录到 Atuin 服务器。数据在离开机器前用每记录内容加密密钥信封加密。
  4. TUI 搜索界面:全屏终端 UI(用 ratatui 构建)替代 Ctrl+R 带模糊/前缀/全文搜索和过滤模式。

加密细节 #

协议算法状态
V1(遗留)XSalsa20Poly1305(NaCl secretbox)淘汰中
V2(当前)PASETO V4 Local(XChaCha20-Poly1305 + Blake2b)活跃

V2 用信封加密:每记录获随机 CEK 用用户主密钥包装。主密钥在 ~/.local/share/atuin/key 永不离开设备。

为什么 SQLite 胜过纯文本? #

传统 shell 历史将命令存储为换行分隔文本。history | grep 工作但在规模崩溃:

  • 查询性能:适当索引 SQLite 可 50ms 内搜索 500,000 命令。50MB 文本文件 grep 需 200ms+ 阻塞 shell。
  • 结构化元数据:纯文本无法存储退出码、目录、时长无需脆弱解析。
  • 并发访问:SQLite WAL 模式允许 shell 写历史同时 Atuin TUI 读,无文件锁损坏数据。
  • 去重和修剪:SQL DELETEWHERE 子句让你手术式移除条目(如含 password 所有命令)而非编辑文本文件。

安装 & 设置 #

一键安装(推荐) #

# Unix/macOS — 交互安装带 shell 设置提示
curl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | sh

# 非交互(CI、Dockerfiles)
curl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | sh -s -- --non-interactive

安装器放置二进制在 ~/.atuin/bin/atuin 添加 shell 集成到你 rc 文件。

包管理器 #

# Homebrew(macOS/Linux)
brew install atuin

# Cargo(需 Rust 工具链)
cargo install atuin

# Arch Linux
sudo pacman -S atuin

# NixOS / nix
nix-env -iA nixpkgs.atuin

# Debian/Ubuntu(从 GitHub releases)
VERSION="18.16.1"
curl -LO "https://github.com/atuinsh/atuin/releases/download/v${VERSION}/atuin_${VERSION}_amd64.deb"
sudo dpkg -i "atuin_${VERSION}_amd64.deb"

# Windows(WinGet)
winget install -e Atuinsh.Atuin

Shell 集成 #

安装后,添加 Atuin 到你 shell 的 rc 文件:

# Bash — 加到 ~/.bashrc
eval "$(atuin init bash)"

# Zsh — 加到 ~/.zshrc
eval "$(atuin init zsh)"

# Fish — 加到 ~/.config/fish/config.fish
atuin init fish | source

# Nushell — 加到 config.nu
atuin init nu | save ~/.config/nushell/atuin.nu
source ~/.config/nushell/atuin.nu

重新加载 shell 或运行 exec $SHELL 激活。

导入现有历史 #

# 自动检测 shell 并导入
atuin import auto

# 或显式指定
atuin import bash
atuin import zsh
atuin import fish

# 检查导入了什么
atuin stats

验证安装 #

$ atuin --version
atuin 18.16.1

$ atuin doctor
Atuin Doctor
Checking for diagnostics
[] Atuin is compiled with sqlite support
[] Atuin is compiled with sync support
[] Atuin config directory exists

核心配置 #

Atuin 配置在 ~/.config/atuin/config.toml。在深入设置前,这里不同过滤模式应用搜索界面实际样子:

Atuin 搜索 UI

Atuin TUI 显示带模糊匹配和目录作用域结果的 inline 搜索窗口。 这里是生产加固配置:

# ~/.config/atuin/config.toml
[settings]
# 搜索模式: prefix, fulltext, fuzzy, skim
search_mode = "fuzzy"

# 过滤模式: global, host, session, directory
filter_mode = "global"

# UI 样式: compact, full
style = "compact"

# 同步设置
auto_sync = true
sync_frequency = "5m"
sync_address = "https://api.atuin.sh"

# 不记录敏感命令(正则模式)
history_filter = [
    "^export.*KEY",
    "^export.*SECRET",
    "^export.*PASSWORD",
    "^aws configure",
    "^ssh-keygen",
]

# 工作目录过滤 — 不在这些路径记录
cwd_filter = [
    "/tmp/secrets",
    "~/.*cred",
]

# Enter 接受命令; false = Tab 编辑首选项
enter_accept = true

# 搜索 UI 显示帮助提示
show_help = false

# 结果数量
inline_height = 20

atuin 设置过程生成默认配置,但生产环境受益显式调整。配置用 TOML 格式支持大多数设置热重载。

关键配置选项解释 #

# 查看当前配置值
atuin config get search_mode
# fuzzy

# 查看解析(有效)值
atuin config get search_mode --resolved
# fuzzy

# 内联设置配置值
atuin config set search_mode fulltext
atuin config set filter_mode directory

# 打印完整配置
atuin config print

搜索与过滤模式 #

# Ctrl+R 交互切换过滤模式
# 默认过滤模式: global -> host -> session -> directory

# 带过滤器命令行搜索
atuin search --exit 0 --after "yesterday 3pm" make
atuin search --before "2026-01-01" --cwd /project deploy
atuin search --exit 1 --session       # 本次会话失败命令

# 删除匹配条目
atuin search --delete "rm -rf /accident"

流行工具集成 #

Starship 提示 #

Starship 与 Atuin 无冲突配合。两者独立 hook shell 事件:

# ~/.config/starship.toml — 无需特殊配置
# Atuin 处理历史; Starship 处理提示
# 只需确保 Atuin init 在 rc 文件 Starship init 前运行
# ~/.zshrc — 顺序重要
eval "$(atuin init zsh)"       # Atuin 先
eval "$(starship init zsh)"    # Starship 后

tmux #

Atuin 与 tmux 会话干净集成。每个 tmux 窗口获自己会话 ID,启用每窗口历史过滤:

# ~/.tmux.conf — 绑定键打开 Atuin 搜索
bind-key r run-shell "tmux send-keys C-r"

# Atuin 自动通过环境变量检测 tmux 会话
# 按会话过滤: 按 Ctrl+R 然后切换过滤模式

fzf #

有些用户将 Atuin 与 fzf 配对用于文件模糊查找同时用 Atuin 用于历史:

# 保持 fzf 用于文件,Atuin 用于历史
# 禁用 fzf 历史绑定(在 ~/.bashrc 或 ~/.zshrc)
export FZF_DEFAULT_COMMAND='fd --type f --hidden'
# 不绑定 Ctrl+R — 让 Atuin 处理

# fzf 用于文件
alias ff='fzf --preview "bat --style=numbers --color=always {}"'

# Atuin 用于历史(自动绑定到 Ctrl+R)

Nushell #

Nushell 集成需显式设置因 Nushell 用不同配置系统:

# config.nu
source ~/.config/nushell/atuin.nu

# 设置环境变量
$env.ATUIN_NOBIND = true  # 如果你想自定义键绑定

Docker / Dev Containers #

# Dockerfile.dev
RUN curl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | sh -s -- --non-interactive
COPY config.toml /root/.config/atuin/config.toml
RUN echo 'eval "$(atuin init bash)"' >> /root/.bashrc

自托管同步服务器 #

对团队或隐私意识用户,Atuin 同步服务器可用 Docker 自托管。下面自托管 atuin 教程用带 PostgreSQL 的 Docker Compose,比服务器规模 SQLite 更好处理并发写。

Docker Compose 设置 #

# docker-compose.yml
version: "3"
services:
  atuin:
    restart: always
    image: ghcr.io/atuinsh/atuin:latest
    command: server start
    volumes:
      - ./config:/config
      - ./atuin-data:/atuin-data
    links:
      - postgresql
    ports:
      - "8888:8888"
    environment:
      ATUIN_HOST: "0.0.0.0"
      ATUIN_PORT: "8888"
      ATUIN_OPEN_REGISTRATION: "true"
      ATUIN_DB_URI: "postgres://atuin:***@postgresql/atuin"
      RUST_LOG: "info,atuin_server=debug"
    user: "1000:1000"

  postgresql:
    image: postgres:14
    restart: always
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: atuin
      POSTGRES_PASSWORD: change-me
      POSTGRES_DB: atuin
    user: "1000:1000"

  # 可选: 自动备份
  backup:
    image: prodrigestivill/postgres-backup-local
    restart: always
    volumes:
      - ./backups:/backups
    links:
      - postgresql
    environment:
      POSTGRES_HOST: postgresql
      POSTGRES_DB: atuin
      POSTGRES_USER: atuin
      POSTGRES_PASSWORD: change-me
      POSTGRES_EXTRA_OPTS: "-Z6 --schema=public --blobs"
      SCHEDULE: "@daily"
      BACKUP_KEEP_DAYS: "7"

启动服务器 #

# 创建数据目录
mkdir -p atuin-data postgres-data backups

# 启动服务
docker compose up -d

# 检查健康
curl http://localhost:8888/health
# {"status":"ok"}

自托管客户端配置 #

# ~/.config/atuin/config.toml
[settings]
sync_address = "http://your-server:8888"
auto_sync = true
sync_frequency = "5m"
# 在你自托管服务器注册新账户
atuin register -u myuser -e myuser@example.com -p securepassword

# 或在附加机器登录
atuin login -u myuser -p securepassword

# 获取你的加密密钥(安全备份)
atuin key
# c2e2d6e5a9b1c3f4d7e8a9b0c1d2e3f4...

# 触发同步
atuin sync

Kubernetes 部署 #

# atuin-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: atuin-server
spec:
  replicas: 2
  selector:
    matchLabels:
      app: atuin
  template:
    metadata:
      labels:
        app: atuin
    spec:
      containers:
        - name: atuin
          image: ghcr.io/atuinsh/atuin:18.16.1
          command: ["atuin", "server", "start"]
          ports:
            - containerPort: 8888
          env:
            - name: ATUIN_HOST
              value: "0.0.0.0"
            - name: ATUIN_DB_URI
              valueFrom:
                secretKeyRef:
                  name: atuin-db-secret
                  key: uri
---
apiVersion: v1
kind: Service
metadata:
  name: atuin-service
spec:
  selector:
    app: atuin
  ports:
    - port: 8888
      targetPort: 8888

基准 / 真实世界用例 #

性能特征 #

指标AtuinmcflyHstrfzf
搜索速度(100K 命令)< 50ms~200ms~100ms~300ms
内存占用~50MB~30MB~20MB~10MB
跨机器同步是(加密)
多 shell 支持Bash/Zsh/Fish/NushellZsh onlyZsh/Bash所有
GitHub stars29,7945,2004,80058,000

真实部署 #

  1. 开发者舰队同步:10 开发者用自托管 Atuin 服务器,跨笔记本/服务器同步历史。加密确保敏感命令(API 密钥、密码)不暴露。
  2. CI/CD 集成:GitHub Actions 用 Atuin 捕捉工作流命令,便于故障排除和审计。
  3. 团队知识共享:共享常见命令模式通过跨机器同步,新成员可搜索团队历史学习最佳实践。

与替代方案对比 #

特性AtuinmcflyHstrfzf
跨机器同步是(加密)
搜索模式模糊/前缀/全文模糊模糊模糊
多 shellBash/Zsh/Fish/NushellZshZsh/Bash所有
加密PASETO V4
自托管N/A
GitHub stars29,7945,2004,80058,000

何时选择 Atuin #

  • 需要跨机器同步 shell 历史
  • 需要加密保护敏感命令
  • 用多种 shell(Bash/Zsh/Fish/Nushell)
  • 想自托管同步服务器

何时选择 fzf #

  • 只需本地文件/历史模糊查找
  • 不需要同步或加密
  • 已有丰富 fzf 集成

局限 / 诚实评估 #

Atuin 不是万能药。以下局限提交前知晓:

  1. 本地 SQLite 未加密:本地历史数据库以明文存储。用 LUKS/FileVault 文件系统加密用于本地保护。
  2. 同步服务器需维护:自托管需维护 PostgreSQL 和 Atuin 服务器。用托管服务可免此但需信任第三方。
  3. Bash 集成可能脆弱:Bash preexec hooks 依赖 DEBUG traps 可能与 pyenv/nodenv 冲突。Zsh/Fish 更稳定。
  4. 无内置命令执行:Atuin 仅搜索历史不执行命令。用 Enter 接受或 Tab 编辑。

常见问题 #

Q: Atuin 在跨机器同步加密我的 shell 历史吗? #

A: 是的。所有同步数据在离开机器前用 PASETO V4(XChaCha20-Poly1305 + Blake2b)客户端加密,所以同步服务器只看到加密 blob 无法读命令。然而本地 SQLite 数据库未加密存用于搜索性能,所以用 LUKS 或 FileVault 文件系统加密用于本地保护。

Q: 我能不用同步或创建账户使用 Atuin 吗? #

A: 可以。Atuin 作为本地工具完全工作:跳过注册忽略所有同步命令。历史存储在本地 SQLite 数据库,所有搜索、过滤和统计功能完全离线工作。

Q: Atuin 支持哪些 shell? #

A: Atuin 支持 Bash、Zsh、Fish、Nushell、Xonsh,以及 PowerShell 作为第 2 级(较少测试)集成。Bash 集成可能脆弱因为 preexec hooks 依赖 DEBUG traps 可能与 pyenv 或 nodenv 冲突,而 Zsh 和 Fish 集成更可靠。

Q: 我如何阻止敏感命令如密码或 API 密钥保存在 Atuin? #

A: 在 ~/.config/atuin/config.toml 的 history_filter 设置加正则模式,例如 “^export.*SECRET”、"^export.*PASSWORD”、"^aws configure” 或 “^ssh-keygen”。也可用 cwd_filter 排除特定目录如 /tmp/secrets 运行命令。

Q: 我如何自托管 Atuin 同步服务器? #

A: 用 Docker Compose 配合 ghcr.io/atuinsh/atuin 镜像运行 “server start” 和 PostgreSQL 后端,暴露端口 8888。用 docker compose up -d 启动后,在 config.toml 设 sync_address 为 http://your-server:8888,然后用 atuin register 注册账户,运行 atuin sync。

加入社区 #


本文由 Dibi8 编辑团队独立研究撰写。我们可能从联盟链接获得佣金,但这不影响编辑独立性。

💬 留言讨论