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 用 SQLite 数据库替代现有 shell 历史,通过 Ctrl+R 激活全屏模糊搜索 UI。

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 后端 |
+---------------------------------------------+
核心组件 #
- Shell Hook 层:Atuin 通过 shell 特定插件注册
preexec(命令前)和precmd(命令后)hooks。捕获命令字符串、工作目录、开始时间、退出码。 - 本地 SQLite 数据库:所有历史存储在
~/.local/share/atuin/history.db用 SQLite WAL 模式并发读写性能。 - 同步客户端:可选后台同步推加密记录到 Atuin 服务器。数据在离开机器前用每记录内容加密密钥信封加密。
- 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
DELETE带WHERE子句让你手术式移除条目(如含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 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
基准 / 真实世界用例 #
性能特征 #
| 指标 | Atuin | mcfly | Hstr | fzf |
|---|---|---|---|---|
| 搜索速度(100K 命令) | < 50ms | ~200ms | ~100ms | ~300ms |
| 内存占用 | ~50MB | ~30MB | ~20MB | ~10MB |
| 跨机器同步 | 是(加密) | 否 | 否 | 否 |
| 多 shell 支持 | Bash/Zsh/Fish/Nushell | Zsh only | Zsh/Bash | 所有 |
| GitHub stars | 29,794 | 5,200 | 4,800 | 58,000 |
真实部署 #
- 开发者舰队同步:10 开发者用自托管 Atuin 服务器,跨笔记本/服务器同步历史。加密确保敏感命令(API 密钥、密码)不暴露。
- CI/CD 集成:GitHub Actions 用 Atuin 捕捉工作流命令,便于故障排除和审计。
- 团队知识共享:共享常见命令模式通过跨机器同步,新成员可搜索团队历史学习最佳实践。
与替代方案对比 #
| 特性 | Atuin | mcfly | Hstr | fzf |
|---|---|---|---|---|
| 跨机器同步 | 是(加密) | 否 | 否 | 否 |
| 搜索模式 | 模糊/前缀/全文 | 模糊 | 模糊 | 模糊 |
| 多 shell | Bash/Zsh/Fish/Nushell | Zsh | Zsh/Bash | 所有 |
| 加密 | PASETO V4 | 无 | 无 | 无 |
| 自托管 | 是 | 否 | 否 | N/A |
| GitHub stars | 29,794 | 5,200 | 4,800 | 58,000 |
何时选择 Atuin #
- 需要跨机器同步 shell 历史
- 需要加密保护敏感命令
- 用多种 shell(Bash/Zsh/Fish/Nushell)
- 想自托管同步服务器
何时选择 fzf #
- 只需本地文件/历史模糊查找
- 不需要同步或加密
- 已有丰富 fzf 集成
局限 / 诚实评估 #
Atuin 不是万能药。以下局限提交前知晓:
- 本地 SQLite 未加密:本地历史数据库以明文存储。用 LUKS/FileVault 文件系统加密用于本地保护。
- 同步服务器需维护:自托管需维护 PostgreSQL 和 Atuin 服务器。用托管服务可免此但需信任第三方。
- Bash 集成可能脆弱:Bash preexec hooks 依赖 DEBUG traps 可能与 pyenv/nodenv 冲突。Zsh/Fish 更稳定。
- 无内置命令执行: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。
加入社区 #
- GitHub: atuinsh/atuin
- 文档: docs.atuin.sh
- Discord: Atuin Discord
本文由 Dibi8 编辑团队独立研究撰写。我们可能从联盟链接获得佣金,但这不影响编辑独立性。
💬 留言讨论