Once: Công cụ dòng lệnh giúp cache kết quả lệnh CLI, không cần xác thực vân tay mỗi lần đọc secret
Once là tiện ích CLI viết bằng Go, cho phép chạy một lệnh và lưu lại kết quả trong bộ nhớ thông qua daemon nền theo từng người dùng. Công cụ này đặc biệt hữu ích khi đọc secret từ 1Password, giúp tránh phải xác thực vân tay liên tục trong khoảng thời gian TTL đã đặt.

Once: Cache lệnh CLI, đọc secret một lần dùng cả ngày
Once là một công cụ dòng lệnh mới trên GitHub, giúp chạy một lệnh và tái sử dụng kết quả trong một khoảng thời gian nhất định. Điểm đáng chú ý là nó lưu output trong bộ nhớ thông qua một daemon nền nhỏ gọn theo từng người dùng, tự động tắt khi hết hạn.
Công cụ này đặc biệt phù hợp với những ai thường xuyên đọc secret từ 1Password hoặc các trình quản lý mật khẩu CLI khác, khi mà mỗi lần đọc đều phải xác thực bằng vân tay gây phiền toái.
Cách hoạt động
Khi bạn chạy một lệnh qua once, nó sẽ thực thi lệnh đó trong thư mục hiện tại, in ra stdout và lưu kết quả vào daemon. Những lần gọi sau với cùng lệnh, cùng thư mục và cùng tenant key sẽ được trả về từ bộ nhớ cho đến khi entry hết hạn. Daemon sẽ tự dừng khi entry cuối cùng hết hạn.
Ví dụ điển hình trong file ~/.zshrc:
export ONCE_TENANT="${ONCE_TENANT:-$(uuidgen)}"
export GITHUB_TOKEN="$(once --ttl 8h --no-dir -- op read op://Private/GitHub/token)"
Lần gọi đầu tiên sẽ yêu cầu vân tay, nhưng mọi lần gọi tiếp theo trong vòng 8 giờ với cùng tenant key sẽ không cần xác thực nữa.
Các tùy chọn chính
Cú pháp cơ bản của once:
once --ttl DURATION [--until TIME] [--tenant KEY] [--refresh] [--no-dir] -- COMMAND [ARGS...]
- --ttl: Thời gian cache kết quả, ví dụ
30m,1h,24h(bắt buộc) - --until: Giới hạn thời gian tuyệt đối cho entry, kết hợp với TTL để lấy giá trị nào đến trước
- --tenant: Khóa phân tách các ngữ cảnh cache, mặc định lấy từ
$ONCE_TENANT - --refresh: Bỏ qua cache, chạy lại lệnh và ghi đè giá trị đã lưu
- --no-dir: Loại bỏ thư mục làm việc khỏi cache key
Ngoài ra còn có các lệnh phụ trợ:
once status: Xem trạng thái daemon, số entry và thời điểm dừngonce clear: Xóa toàn bộ cache và dừng daemononce help: Xem trợ giúp
Tenant key và phạm vi cache
Cache key được tính bằng HMAC-SHA256(tenant, thư mục làm việc ‖ lệnh ‖ tham số). Tenant key đóng vai trò như một namespace, giúp:
- Tách biệt ngữ cảnh cache giữa các shell, dự án hoặc script khác nhau
- Khiến cache key gần như không thể đoán được
Mẫu ${ONCE_TENANT:-$(uuidgen)} sẽ cấp cho mỗi terminal một tenant riêng, trong khi các subshell và script khởi chạy từ đó vẫn chia sẻ cache.
Giới hạn thời gian với --until
Tùy chọn --until nhận thời gian tuyệt đối, giúp giới hạn cache theo mốc thời gian cụ thể. Ví dụ, cache tối đa 1 ngày nhưng không vượt quá 10 giờ tối hôm nay:
once --ttl 24h --until "$(date +%F)T22:00" --no-dir -- op read op://Work/DB/password
Các định dạng được chấp nhận gồm 2026-10-09T06:00:00+02:00, 2026-10-09T06:00, 2026-10-09. Nếu --until đã ở quá khứ, lệnh vẫn chạy bình thường nhưng kết quả không được cache.
Mô hình bảo mật
Once bảo vệ trước người dùng khác thông qua Unix socket và quyền file: thư mục runtime có mode 0700, socket có mode 0600. Tuy nhiên, các tiến trình của cùng một người dùng vẫn có thể truy cập cache — đây là thiết kế được chấp nhận có chủ đích.
Một số biện pháp bảo vệ bổ sung:
- Giá trị được lưu không mã hóa trong bộ nhớ daemon, nhưng được ghi đè trước khi giải phóng
- Core dump của daemon bị vô hiệu hóa (
RLIMIT_CORE 0,PR_SET_DUMPABLE 0trên Linux) - Output lớn hơn 64 MiB sẽ không được cache
Cài đặt
Công cụ yêu cầu Go 1.27+ và không có dependency ngoài thư viện chuẩn:
go install github.com/alex0ptr/once@latest
Once hiện chỉ hỗ trợ macOS và Linux. Dự án được phát hành theo giấy phép MIT.
Góc nhìn cho lập trình viên Việt Nam
Với các đội phát triển phần mềm thường xuyên sử dụng công cụ CLI để quản lý secret — như 1Password CLI, Bitwarden CLI, hay HashiCorp Vault — once có thể giúp tiết kiệm đáng kể thời gian. Thay vì phải xác thực sinh trắc học mỗi lần chạy script, lập trình viên chỉ cần xác thực một lần và tái sử dụng kết quả trong suốt phiên làm việc.
Tuy nhiên, cần lưu ý rằng công cụ này không phải là ranh giới bảo mật giữa các tiến trình cùng người dùng. Trong môi trường nhiều người chia sẻ cùng một máy tính hoặc tài khoản, cần cân nhắc kỹ trước khi sử dụng cho các secret quan trọng.
Nếu bạn đang tìm cách tối ưu quy trình phát triển với các lệnh CLI tốn thời gian như
git rev-parse,op readhay các truy vấn API lặp lại, once là một lựa chọn đáng thử — nhẹ, không phụ thuộc và dễ tích hợp vào shell script hiện có.
