5 cơ chế Claude Code giúp ngăn chặn các lỗi tốn kém ngay tại terminal
Mua gói Thành viên QuanTriMang Pro để trải nghiệm website không quảng cáo và sử dụng các tiện ích AI trên QuanTriMang.
Claude Code có thể rất giỏi trong việc suy luận về code, nhưng nó không phải lúc nào cũng dừng lại để cân nhắc các hệ quả theo cách mà một người cẩn trọng sẽ làm. Và đó chính xác là khoảng trống mà các "hook" (cơ chế kích hoạt) được tạo ra để lấp đầy.
Đây là các lệnh shell, HTTP endpoint hoặc thậm chí là các câu lệnh (prompt) dành cho LLM, được kích hoạt tự động tại những thời điểm cụ thể trong vòng đời hoạt động của Claude Code - chẳng hạn như ngay trước khi gọi một công cụ hoặc ngay sau khi tác vụ đó hoàn tất. Và vì chúng là các script hoạt động theo quy tắc cố định chứ không phải là những gợi ý trong câu lệnh, nên chúng luôn vận hành theo cùng một cách nhất quán, thay vì phụ thuộc vào cách Claude cho là nên làm.
Mục lục bài viết
Chặn các lệnh gây hại trước khi chúng được thực thi
Cơ chế rõ ràng và có lẽ quan trọng nhất là bộ lọc bảo vệ (PreToolUse guard) áp dụng cho công cụ Bash; nó quét mọi lệnh trước khi thực thi và chặn bất kỳ lệnh nào có tính chất phá hoại. Các ví dụ bao gồm lệnh `rm -rf`, các tiện ích ổ đĩa như `dd` hoặc `mkfs`, hay kiểu lệnh `curl-pipe-to-shell` (tải xuống và thực thi script ngay lập tức mà không kiểm tra).
Hook này đọc lệnh được đề xuất từ `stdin` dưới dạng JSON, đối chiếu nó với danh sách các mẫu biểu thức chính quy (regex), và nếu khớp, nó sẽ thoát với code 2. Exit code này báo hiệu cho Claude chặn hành động đó đồng thời gửi lý do lại cho Claude qua `stderr`, giúp AI hiểu tại sao nó bị dừng và có thể đề xuất các hành động thay thế thay vì chỉ thử lại một cách mù quáng.
#!/bin/bash
command=$(cat | jq -r '.tool_input.command')
[[ "$command" =~ rm\ -rf|dd\ if=|mkfs\. ]] && echo "Blocked: destructive command" >&2 && exit 2
exit 0
Bảo vệ môi trường và thông tin nhạy cảm
Bởi vì Claude thực sự muốn "sửa" file `.env` của bạn
Một hook phát triển hữu ích khác nhắm cụ thể vào các công cụ Edit và Write, nhằm ngăn Claude truy cập vào những file `.env` hoặc bất kỳ file nào có chứa thông tin nhạy cảm hay thông tin xác thực trong đường dẫn. Cơ chế này quan trọng hơn bạn nghĩ vì Claude có xu hướng muốn "sửa" file cấu hình môi trường khi đang gỡ lỗi các vấn đề về cấu hình; đây chính xác là kiểu chỉnh sửa file mà bạn không muốn AI thực hiện, đặc biệt là khi không có sự giám sát của con người.
Hook này kiểm tra đường dẫn file đang được ghi vào, và nếu nó khớp với một mẫu được bảo vệ, nó sẽ thoát với code 2 và từ chối thẳng việc chỉnh sửa. Phần còn lại của quy trình hoạt động y hệt như đã mô tả ở trên.
#!/bin/bash
path=$(cat | jq -r '.tool_input.file_path')
[[ "$path" =~ \.env|secrets|credentials ]] && echo "Blocked: protected file" >&2 && exit 2
exit 0
Ngăn chặn lệnh force push và các sự cố Git nghiêm trọng khác
Lịch sử chỉ được coi là bất khả xâm phạm cho đến khi Claude quyết định điều ngược lại
Các sự cố Git là một trong những lỗi gây đau đầu nhất khi thao tác trên terminal vì chúng có thể ghi đè lên lịch sử dùng chung. Một hook (cơ chế chặn) trên trình xử lý lệnh Bash có thể nhận diện cụ thể lệnh `git push --force` hoặc bất kỳ lệnh push nào nhắm vào nhánh `main` hay `master` và chặn chúng lại trước khi thực thi.
Bạn thậm chí có thể tiến xa hơn bằng cách chặn cả lệnh `git reset --hard`, vì lệnh này âm thầm xóa bỏ các thay đổi chưa được commit mà không có tùy chọn hoàn tác. Việc này giúp tránh tình trạng hỏng việc cả buổi chiều chỉ vì Claude quyết định rằng xóa sạch các file chưa commit là cách nhanh nhất để dọn dẹp thư mục làm việc đang lộn xộn.
#!/bin/bash
command=$(cat | jq -r '.tool_input.command')
[[ "$command" =~ push\ --force|push\ .*\ main|reset\ --hard ]] && echo "Blocked: dangerous git command" >&2 && exit 2
exit 0
Ngăn chặn các thao tác cơ sở dữ liệu liều lĩnh
Lệnh `DROP TABLE` không bao giờ được phép xảy ra do sơ suất
Nếu quy trình làm việc của bạn có sử dụng cơ sở dữ liệu - dù là Postgres cho dự án hay hệ thống tự host - bạn sẽ cần một hook có khả năng phát hiện các câu lệnh SQL mang tính phá hủy trước khi chúng được gửi đến terminal. Mô hình `PreToolUse` cũng được áp dụng ở đây: kiểm tra lệnh Bash để tìm các từ khóa như `DROP TABLE` hoặc `TRUNCATE`; nếu phát hiện, hãy từ chối cấp quyền kèm theo lý do rõ ràng thay vì để lệnh được thực thi.
Vì Claude Code có thể trả về phản hồi JSON có cấu trúc bao gồm quyết định cấp quyền (`permissionDecision`: `deny`) và phần giải thích, bạn sẽ nhận được phản hồi hữu ích hơn nhiều so với exit code đơn thuần. Điều này giúp Claude tự điều chỉnh hành động trong lần thử tiếp theo thay vì chỉ báo lỗi rằng nó đã bị chặn.
#!/bin/bash
command=$(cat | jq -r '.tool_input.command')
[[ "$command" =~ DROP\ TABLE|TRUNCATE ]] && echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"Destructive SQL detected"}}'
Kiểm soát trình quản lý gói và cấu hình CI
Những lỗi nhỏ tích tụ nhanh hơn nhiều so với các lỗi lớn
Vấn đề ở đây không hẳn là các thảm họa lớn, mà là những lỗi nhỏ tích tụ dần theo thời gian - ví dụ như khi Claude chạy `npm install` trong một dự án đã quy chuẩn sử dụng `pnpm`, hoặc chỉnh sửa lockfile mà lẽ ra nó không được phép đụng vào. Một hook `PreToolUse` có thể kiểm tra sự tồn tại của file `pnpm-lock.yaml` và chặn bất kỳ lệnh `npm` nào có nguy cơ tạo ra file lockfile gây xung đột; việc này giúp hướng Claude sử dụng đúng công cụ ngay từ đầu thay vì phải dựa vào việc nó tự nhớ các quy ước dự án chỉ qua ngữ cảnh.
Bạn có thể áp dụng ý tưởng tương tự để chặn các thay đổi đối với file cấu hình CI và thậm chí cả script triển khai lên môi trường sản xuất (production) trừ khi có sự phê duyệt rõ ràng từ con người. Cách này cũng giúp giữ cho ngữ cảnh của bạn gọn gàng hơn.
#!/bin/bash
command=$(cat | jq -r '.tool_input.command')
[[ -f pnpm-lock.yaml && "$command" =~ ^npm\ install ]] && echo "Blocked: use pnpm instead" >&2 && exit 2
exit 0
Chỉ cần một file JSON, Claude sẽ hoạt động đúng ý bạn
Tất cả các hook này nằm trong file `.claude/settings.json` (có thể đặt riêng cho từng dự án hoặc trong thư mục người dùng để áp dụng toàn cục), thuộc mảng hook `PreToolUse` cùng với bộ lọc (matcher) cho công cụ tương ứng - thường là Bash, Edit hoặc Write. Vì các hook thực chất là các script, bạn có thể viết chúng bằng Bash kết hợp với `jq`, hoặc bằng Python nếu muốn logic dễ đọc hơn, sau đó đưa chúng vào kho lưu trữ (repository) để bất kỳ ai sử dụng codebase của bạn cũng được hưởng các cơ chế bảo vệ tương tự.
{
"hooks": {
"PreToolUse": [
{ "matcher": "Bash", "hooks": [{ "type": "command", "command": ".claude/hooks/block-destructive-bash.sh" }] },
{ "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": ".claude/hooks/protect-secrets.sh" }] }
]
}
}
Khi đã thiết lập xong các cơ chế này, Claude Code không còn là công cụ đòi hỏi bạn phải giám sát từng chút một nữa. Thay vào đó, bạn có được một công cụ thực sự đáng tin cậy để giao phó việc thao tác bàn phím.
Bạn nên đọc
-
Giải thích giới hạn sử dụng Claude Code: Cách hoạt động và cách tránh chạm giới hạn
-
LTX-2.5: Mô hình AI trọng số mở mới dành cho video và robot
-
Cách sử dụng Claude Code miễn phí (và các giới hạn đi kèm)
-
Tài liệu tham khảo toàn diện về các lệnh Claude Code
-
Lợi ích khi dùng Claude Code thay thế phần mềm CAD
-
Cách sử dụng Firecrawl sửa lỗi duyệt web của Claude Code
-
Hugging Face - Hệ sinh thái Python đã thay đổi hoàn toàn cách phát triển AI
-
Cách quản lý dự án hiệu quả với AI
-
Tìm hiểu về Rowboat: Ứng dụng AI mã nguồn mở có thể thay thế Claude Cowork
Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:
Hướng dẫn AI
AI Tools
Học IT





Hàm Excel