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.

Phê duyệt yêu cầu cấp quyền của Claude Code (và Codex) từ điện thoại

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". Hook PreToolUse được kích hoạt trước mỗi lần gọi công cụ và có thể trả về allow, deny, ask hoặc defer. 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:

  1. Khởi động một phiên bằng claude remote-control (chế độ server) hoặc claude --remote-control, hoặc gõ /remote-control trong một phiên đang chạy.
  2. Đă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.
  3. Trong terminal, chạy /config và 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_FILE mở 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 claude phả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ự ánHookNếu bạn không trả lờiGhi chú
claude-remote-approver (yuuichieguchi)PermissionRequestQuay 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)PermissionRequestQuay 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, StopChờ khoảng 9 phút, rồi quay về terminalChờ 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 CodexMặc định 15 phút, có thêm khoảng chờ dài hơn cho câu trả lời muộnHỗ 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 PermissionRequest có thể trả lời bằng "behavior": "allow" hoặc "deny", còn PreToolUse có thể từ chối. Chúng nằm trong ~/.codex/hooks.json hoặc mục [hooks] trong config.toml. Đó là thứ hookline dùng cho Codex. Thiết lập notify cũ 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. agy headless 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 -rf nằ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 cho Bash(*).
  • 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 PreToolUse bị 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?
Có, qua Remote Control. Kết nối phiên với ứng dụng Claude, rồi bật Push when actions required (và tùy chọn Push when Claude decides) trong /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?
Với các hook dựa trên ntfy thì có: chúng gắn nút Approve/Deny vào thông báo. Tài liệu của Anthropic mô tả thông báo đẩy cho yêu cầu cấp quyền nhưng không nói đến nút trả lời ngay trên thông báo, nên hãy chuẩn bị trả lời trong ứng dụng Claude. Thông báo cấp quyền của Maude có sẵn nút Cho phép và Từ chối.
Chuyện gì xảy ra nếu tôi không trả lời?
Trong chính Claude Code, yêu cầu cấp quyền vẫn mở cho đến khi được trả lời, nên phiên chỉ đơn giản là chờ. Các hook ntfy tự dựng hết thời gian chờ sau khoảng đã cấu hình và quay về lời nhắc thông thường trong terminal. Hãy kiểm tra để mọi hook bạn viết đều chặn khi gặp lỗi: hook 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?
Có. Codex hỗ trợ hook 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?
Nó an toàn đến mức kênh truyền và sự chú ý của bạn cho phép. Dùng topic ntfy không thể đoán hoặc có xác thực, đọc toàn bộ lệnh trước khi phê duyệt, tránh các quy tắc "always allow" tràn lan cho lệnh shell, và 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.

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.

Không còn bỏ lỡ yêu cầu cấp quyền

Cho phép hoặc Từ chối ngay từ thông báo, cho mọi agent trên mọi máy chủ. iOS và Android.

Download Maude on the App Store Get Maude on Google Play