Phê duyệt
Phê duyệt yêu cầu cấp quyền của Claude Code (và Codex) từ điện thoại
Lý do thường gặp nhất khiến agent ngừng tiến triển là một yêu cầu cấp quyền không ai nhìn thấy. Có ba cách để trả lời nó ngay từ túi áo: thông báo đẩy có sẵn của Claude Code, một hook ntfy tự dựng, hoặc một ứng dụng có hộp thư. Dưới đây là cách từng cách hoạt động với Claude Code, những gì thay đổi với Codex và các agent khác, và cái giá về bảo mật của mỗi cách.
Trả lời nhanh
Với gói Pro, Max, Team hoặc Enterprise, hãy khởi động Remote Control và bật Push when actions required trong /config. Ứng dụng Claude sẽ thông báo cho bạn, và bạn trả lời yêu cầu trong ứng dụng. Nếu muốn một phương án miễn phí, tự host, các hook mã nguồn mở như claude-remote-approver gửi mỗi PermissionRequest tới ntfy kèm nút Approve/Deny. Codex cũng có hook PermissionRequest tương tự. Các ứng dụng như Maude hiển thị yêu cầu từ nhiều agent trong một hộp thư, với thông báo đẩy có sẵn nút Cho phép/Từ chối.
Khi Claude Code muốn chạy một lệnh hoặc sửa một file mà bạn chưa cho phép trước, nó dừng lại và hỏi. Nếu bạn đang ngồi trước terminal, việc này mất một giây. Nếu không, phiên sẽ chờ, và có thể chờ cả tiếng đồng hồ chỉ vì một lần bấm phím. Mọi cách phê duyệt từ xa đều đưa yêu cầu tới điện thoại của bạn và gửi câu trả lời về cho agent. Chúng khác nhau ở cách chặn yêu cầu, đường đi của nó, và ai có thể trả lời.
Phê duyệt từ xa hoạt động thế nào
Có hai cơ chế, và công cụ nào cũng dùng một trong hai.
- Giao thức từ xa riêng của agent. Remote Control của Claude Code chuyển hộp thoại cấp quyền thật tới ứng dụng Claude. Remote Control của Antigravity và app-server của Codex cũng hoạt động như vậy. Không có thứ gì ở giữa tự quyết định: bạn đang trả lời chính yêu cầu của agent.
- Hook. Claude Code chạy một chương trình do bạn cấu hình tại những thời điểm cố định. Hook
PermissionRequestđược kích hoạt khi một hộp thoại cấp quyền sắp xuất hiện, và có thể trả lời thay bạn bằng cách in ra một quyết định như{"behavior": "allow"}hoặc"deny". HookPreToolUseđược kích hoạt trước mỗi lần gọi công cụ và có thể trả vềallow,deny,askhoặcdefer. Một hook gửi thông báo đẩy rồi chờ bạn bấm chính là cách mọi công cụ phê duyệt qua điện thoại tự dựng hoạt động. Chi tiết có trong tài liệu tham khảo về hook.
Thông báo đẩy có sẵn trong Claude Code
Cách chính thức của Anthropic đi qua Remote Control:
- Khởi động một phiên bằng
claude remote-control(chế độ server) hoặcclaude --remote-control, hoặc gõ/remote-controltrong một phiên đang chạy. - Đăng nhập ứng dụng Claude trên điện thoại bằng cùng tài khoản, và cho phép thông báo.
- Trong terminal, chạy
/configvà bật Push when actions required, tùy chọn này bao gồm yêu cầu cấp quyền và câu hỏi. Push when Claude decides bao gồm các cập nhật chủ động như "tests finished".
Tài liệu lưu ý vài điều bạn sẽ gặp:
- Gói và xác thực. Remote Control có trên gói Pro, Max, Team và Enterprise, và không hỗ trợ API key. Trên Team và Enterprise, một Owner phải bật tính năng này.
- Yêu cầu không hết hạn. Yêu cầu cấp quyền và câu hỏi vẫn mở cho đến khi bạn trả lời.
- Thông báo đẩy tạm dừng khi bạn đang ở terminal. Claude Code không gửi thông báo đẩy khi bạn đang gõ hoặc đang focus vào terminal được kết nối.
CLAUDE_CLIENT_PRESENCE_FILEmở rộng điều đó ra mọi lúc bạn đang ngồi trước máy. - Tiến trình phải luôn chạy. Tiến trình
claudephải tiếp tục chạy, nên trên máy chủ, hãy khởi động nó bên trong tmux. - Một số chế độ không chọn được từ ứng dụng. Theo tài liệu cho di động, bạn không thể chọn Bypass permissions từ ứng dụng, cũng như Auto cho một phiên Remote Control.
Nếu bạn dùng gói Claude và chỉ dùng Claude Code, hãy bắt đầu từ đây. Nó miễn phí kèm gói của bạn và do Anthropic duy trì.
Tự dựng bằng hook ntfy
ntfy là một dịch vụ thông báo đẩy mã nguồn mở. Bạn publish lên một topic bằng một HTTP request đơn giản, và ứng dụng ntfy trên điện thoại sẽ hiển thị nó. Một số dự án mã nguồn mở kết hợp nó với hook PermissionRequest. Hook gửi lệnh gọi công cụ đang chờ lên topic của bạn kèm các nút hành động, chờ bạn bấm trên một topic thứ hai, rồi in quyết định trả về cho Claude Code. Ghi nhận công sức của các tác giả:
| Dự án | Hook | Nếu bạn không trả lời | Ghi chú |
|---|---|---|---|
| claude-remote-approver (yuuichieguchi) | PermissionRequest | Quay về lời nhắc trong terminal sau 120 giây (300 giây với việc duyệt kế hoạch) | npm install -g claude-remote-approver; tạo một topic ngẫu nhiên 128-bit; Approve / Always Approve / Deny |
| claude-push (coa00) | PermissionRequest | Quay về terminal sau 90 giây (có thể cấu hình) | Cài bằng shell script; Allow / Deny |
| claude-code-phone-notifications (ssarnecki) | PermissionRequest, PreToolUse, Stop | Chờ khoảng 9 phút, rồi quay về terminal | Chờ 30 giây trước khi gửi phòng khi bạn đang ngồi ở bàn; cũng gửi các câu hỏi AskUserQuestion (không có nút) |
| hookline (tsyche) | PreToolUse cho Claude; PermissionRequest cho Codex | Mặc định 15 phút, có thêm khoảng chờ dài hơn cho câu trả lời muộn | Hỗ trợ cả Codex, Grok và OpenCode; hỗ trợ ntfy tự host có thông tin xác thực |
Cả bốn đều dùng giấy phép MIT. Thời gian chờ là giá trị mặc định theo tài liệu của từng dự án. Nếu bạn chỉ cần một thông báo, không cần trả lời từ xa, hook Notification của Claude Code là đủ. Matcher permission_prompt được kích hoạt khi một hộp thoại xuất hiện:
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [
{ "type": "command",
"command": "curl -s -d 'Claude Code is waiting for approval' https://ntfy.sh/your-long-random-topic" }
]
}
]
}
}
Đặt đoạn này vào ~/.claude/settings.json trên máy đang chạy Claude Code. Bạn vẫn phải vào terminal để trả lời. Các dự án ở trên bổ sung thêm đường trả lời.
Hộp thư của Maude
Maude đi theo cách thứ nhất. Daemon của nó trên máy chủ giao tiếp bằng giao thức riêng của từng agent, nên một yêu cầu cấp quyền tới ứng dụng đúng là yêu cầu thật, chứ không phải thứ do hook đoán ra. Yêu cầu từ mọi phiên trên mọi máy chủ đều về một hộp thư, cạnh các lỗi và việc đã xong. Bạn có thể trả lời ngay tại đó, hoặc trực tiếp từ thông báo đẩy có sẵn nút Cho phép và Từ chối. Yêu cầu sẽ chờ đến khi bạn trả lời; phiên không hết hạn rồi tự chạy tiếp mà không có bạn. Cách này dùng được cho Claude Code, Codex, OpenCode và Grok Build. Antigravity là ngoại lệ: agy headless không thể tạm dừng trước khi chạy một công cụ, nên Maude hiển thị thao tác bị từ chối sau đó và thử lại nếu bạn cho phép. Maude là ứng dụng trả phí, và mỗi agent cần tài khoản riêng. Đây không phải ứng dụng duy nhất có hộp thư và thông báo đẩy: Happier, cùng một số ứng dụng khác, cũng có cả hai.
Codex và các agent khác
- Codex cũng có hook, được bật mặc định. Hook
PermissionRequestcó thể trả lời bằng"behavior": "allow"hoặc"deny", cònPreToolUsecó thể từ chối. Chúng nằm trong~/.codex/hooks.jsonhoặc mục[hooks]trongconfig.toml. Đó là thứ hookline dùng cho Codex. Thiết lậpnotifycũ hơn của Codex chạy một chương trình khi một lượt hoàn tất. Các bài viết của bên thứ ba cho biết nó không được kích hoạt cho yêu cầu phê duyệt, nên hãy dùng hook cho việc phê duyệt. Về cách dùng Codex trên điện thoại qua ứng dụng chính thức và các giới hạn trên Linux, xem Codex CLI trên VPS. - Antigravity trả lời yêu cầu từ bảng điều khiển Remote Control khi bạn chạy nó ở chế độ tương tác hoặc dưới dạng daemon.
agyheadless thì từ chối thay vì hỏi. Xem Antigravity CLI trên máy chủ. - OpenCode và Grok Build được hỗ trợ qua plugin và hook của hookline, hoặc qua các ứng dụng đa agent.
Bảo mật khi phê duyệt từ xa
Một lần phê duyệt từ điện thoại chỉ an toàn bằng mắt xích yếu nhất giữa yêu cầu và cú chạm của bạn.
- Trên ntfy.sh, topic chính là mật khẩu. Tài liệu của ntfy nói thẳng điều này: không cần đăng ký, ai biết tên topic cũng có thể đọc và publish lên đó. Trên server công cộng, một topic bị đoán ra nghĩa là người khác có thể phê duyệt lệnh của agent bạn. Hãy dùng một topic dài và ngẫu nhiên, hoặc tự host ntfy có xác thực.
- Đọc lệnh, đừng chỉ đọc tiêu đề. Thông báo trên màn hình khóa chỉ hiện bản tóm tắt. Một
rm -rfnằm trong một dòng Bash dài rất dễ bị bỏ sót trên màn hình 6 inch. Hãy dùng "always allow" cho công cụ chỉ đọc, đừng dùng choBash(*). - Nắm rõ phương án dự phòng. Các hook tự dựng ở trên quay về lời nhắc trong terminal khi hết thời gian chờ, nên một yêu cầu không được trả lời sẽ bị chặn chứ không tự động được phê duyệt. Nếu tự viết hook, hãy theo cùng quy tắc đó. Tài liệu của Claude Code cảnh báo rằng hook
PreToolUsebị hết thời gian chờ sẽ không chặn lệnh gọi công cụ, lệnh đó vẫn đi tiếp theo luồng cấp quyền thông thường, nên đừng coi một hook bị treo là chốt chặn. - Bảo vệ kênh truyền. Lưu lượng phê duyệt tiết lộ việc agent của bạn đang làm. Remote Control của Anthropic đi qua máy chủ của Anthropic, còn relay của Maude chỉ thấy lưu lượng đã được mã hóa đầu cuối. Với hook, bạn tự chọn nó đi đâu. Thiết lập Require trusted devices của Anthropic giới hạn những thiết bị được dùng Remote Control.
- Phê duyệt là lưới an toàn, không phải sandbox. Chạy agent bằng user không phải root trên một máy bạn có thể dựng lại quan trọng hơn bất kỳ giao diện phê duyệt nào. Xem chạy agent với toàn quyền một cách an toàn.
Trả lời từ Maude
Nếu các agent của bạn chạy trên máy chủ và bạn muốn một chỗ để trả lời tất cả, hãy thử Maude với Claude Code hoặc Codex. Thêm máy chủ từ ứng dụng, đăng nhập bằng gói của chính bạn, và yêu cầu cấp quyền sẽ tới dưới dạng thông báo đẩy có nút Cho phép và Từ chối. Hộp thư gom mọi thứ đang chờ bạn.
Câu hỏi thường gặp
Claude Code có gửi được thông báo đẩy không?
/config. Cần gói Pro, Max, Team hoặc Enterprise; không hỗ trợ đăng nhập bằng API key.Tôi có thể Cho phép hoặc Từ chối ngay trên màn hình khóa không?
Chuyện gì xảy ra nếu tôi không trả lời?
PreToolUse bị hết thời gian chờ sẽ không chặn lệnh gọi công cụ.Cách này có dùng được cho Codex không?
PermissionRequest có thể cho phép hoặc từ chối, và các dự án như hookline dùng nó để chuyển yêu cầu phê duyệt của Codex tới ntfy. Theo các báo cáo của bên thứ ba, thiết lập notify của Codex chỉ áp dụng cho lượt đã hoàn tất, nên hãy dùng hook cho việc phê duyệt.Phê duyệt lệnh từ điện thoại có an toàn không?
Những gì đã thay đổi
- — Xuất bản lần đầu. Hành vi của Remote Control và hook được đối chiếu với tài liệu của Anthropic và OpenAI; chi tiết và giá trị mặc định của từng repo lấy từ README của dự án vào ngày này.