---
title: "Hôm nay hook của mình chặn chính Claude"
date: 2026-11-09
tags: [Claude]
reading_time: 2 phút
author: Cris
url: https://cris-blog.pages.dev/posts/hook-chan-lenh-pha-huy/
---

# Hôm nay hook của mình chặn chính Claude

> Một script bash 20 dòng là lưới an toàn rẻ nhất cho agent có quyền chạy lệnh.

**TL;DR**

- PreToolUse hook chạy trước mỗi lệnh Bash, thoát mã 2 là chặn.
- Lý do chặn được trả lại cho Claude, nó tự sửa và thử lại.
- Bảo vệ tốt nhất không phải cấm, mà là buộc kiểm tra trước.

Mình để Claude Code chạy lệnh mà không hỏi từng lần. Nghe liều, nhưng có một lớp chặn nằm ngoài model: một hook bash. Hôm nay nó chặn đúng lệnh `rm -rf` mà Claude định chạy, và đó chính là việc nó được viết ra để làm.

## Cách hoạt động

Hook `PreToolUse` nhận JSON của lệnh sắp chạy qua stdin. Script đọc lệnh, thấy mẫu nguy hiểm thì in lý do ra stderr và thoát với mã `2`. Claude nhận lý do đó như một phản hồi rồi tự điều chỉnh.

```shell
cmd="$(jq -r '.tool_input.command // empty')"
case "$cmd" in *"# <dấu-xác-nhận>"*) exit 0;; esac

if printf '%s' "$cmd" | grep -Eiq 'rm +-[a-z]*r|docker +compose +down|git +push.*--force'; then
  echo "BLOCKED: kiểm tra và backup target trước, rồi chạy lại kèm '# <dấu-xác-nhận>'" >&2
  exit 2
fi
```

## Thủ thuật nằm ở dấu xác nhận

Mình không cấm hẳn. Lệnh phá huỷ vẫn chạy được, nhưng phải mang theo dấu `# <dấu-xác-nhận>`. Dấu đó là lời cam kết: đã xem target, đã sao lưu. Claude không thể gõ nó mà không đọc thông báo chặn, nên nó phải dừng lại, `ls` thư mục, rồi mới chạy tiếp.

> **Ghi chú:** Hook là mã của bạn, không phải lời nhắc cho model. Model có thể quên một dòng trong CLAUDE.md. Nó không thể quên mã thoát 2.

## Hôm nay chuyện gì xảy ra

Claude vừa tạo một thư mục clone hỏng và muốn dọn bằng `rm -rf`. Hook chặn. Nó chạy `ls` thấy thư mục chỉ có một `.git` rỗng, báo lại cho mình, rồi chạy lại với `# <dấu-xác-nhận>`. Chậm thêm một nhịp, và lần này lệnh xóa có lý do được viết ra.

Khuyết điểm: script bắt theo mẫu chữ nên thua lệnh viết vòng vo. Mình coi nó là dây an toàn chứ không phải tường thành.

## Status

- **Đã thử:** Hook này trên máy làm việc chính, hôm nay nó chặn một lệnh rm -rf thật.
- **Chưa thử:** Chặn bằng danh sách cho phép thay vì danh sách cấm.
- **Sai ở đâu:** Script bắt theo mẫu chữ nên lệnh viết vòng vo có thể lọt.

---

*Viết bởi Cris · cris.blog · 09/11/2026*
