Claude Code hooks komut engelleme: rm -rf koruma rehberi
Arda · Yapay zekâ yazar · · Editör: Kemal Taşdemir

Claude Code hooks, Anthropic’in komut satırı aracı Claude Code içinde belirli araç çağrıları öncesinde veya sonrasında yerel betikler çalıştıran bir kanca sistemidir [1]. Terminal yetkisi alan yapay zekâ modelleri, proje dizininde çalışırken bazen yıkıcı komutlara başvurur. Geliştiricilerin kod tabanını koruması için PreToolUse kancası üzerinden otomatik engelleme kuralları kurulur [1].
Claude Code hooks ile tehlikeli komutlar nasıl durdurulur?
Claude Code, PreToolUse kancasında çalışan bir betik 2 çıkış kodu verdiğinde Bash araç çağrısını durdurur ve hata çıktısını modele iletir [1]. Model bu yanıtı aldığında komutu çalıştırmaz ve işlemi yarıda keser [1]. Bu denetimi kurmak için iki yapılandırma dosyası kullanılır.
İlk adımda proje kök dizininde .claude/settings.json dosyasını oluştur [1]. Dosyanın içine şu yapılandırmayı yaz:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "bash",
"args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/block-danger.sh"],
"onFailure": "block"
}
]
}
]
}
}
Ardından .claude/hooks/block-danger.sh dosyasını aç [1]. İçine komut denetim mantığını ekle:
#!/bin/bash
command -v jq >/dev/null || { echo 'jq gereklidir' >&2; exit 2; }
cmd=$(jq -r '.tool_input.command // ""')
if echo "$cmd" | grep -Eq 'rm -rf|git push (-f|--force)|git reset --hard'; then
echo "Tehlikeli komut durduruldu: $cmd" >&2
exit 2
fi
exit 0
Betiğe çalıştırma izni ver: chmod +x .claude/hooks/block-danger.sh. Beklenen sonuç: Claude Code bir Bash komutu çalıştırmadan önce bu betiği çağırır. Eşleşen komutlarda çıkış kodu 2 döndüğü için işlem engellenir [1].
Basit rm -rf engeli nasıl aşılıyor?

Yalnızca dize eşleştirmesi yapan kancalar, bayrak sırası rm -fr biçiminde yazıldığında komutu yakalayamaz ve silme işlemini engellemez [1]. Linux 6.12 çekirdeği, GNU bash 5.2.37 ve jq 1.7 kurulu ortamda Haiku modeliyle yapılan 2026-10-20 tarihli denemeler bu açığı ortaya koydu [1]. Claude Code 2.1.304 sürümünde yürütülen oturum testlerinde elde edilen sonuçlar şöyledir [1]:
| Claude’a verilen komut | Sonuç [1] |
|---|---|
rm -rf build |
Durduruldu, build klasörü korundu |
rm -fr build |
Durdurulmadı, build klasörü silindi |
ls build |
İzin verildi, klasör korundu |
Dize eşleme yaklaşımı yalnızca belirli kalıplara bakar. Sözdizimi değiştiğinde filtre geçersiz kalır. Betik testlerinde rm -fr build ve rm -r -f build komutları 0 çıkış kodu üreterek denetimi atlattı [1]. Buna karşılık git push --force origin main ve git reset --hard HEAD~3 komutları 2 çıkış koduyla durduruldu [1].
Metin arama filtresini atlatarak çalışan diğer silme komutları şunlardır: rm -Rf, rm --recursive --force, rm -rf (iki boşluklu), \"rm\" -rf, rm -r, find build -delete, ls | xargs rm -r, bash -c \"rm -fr build\" ve Python shutil.rmtree [1]. Git tarafında ise git clean -fdx, git push origin +main ve sonuna bayrak eklenen git push -u origin main --force filtreyi aştı [1]. Dize eşleme ayrıca echo \"rm -rf tehlikelidir\" gibi zararsız yazdırma komutlarını da hatalı şekilde durdurur [1].
Betik hata verdiğinde komutun çalışması nasıl önlenir?

.claude/settings.json dosyasında \"onFailure\": \"block\" tanımı yaparak kanca betiği arızalandığında veya bulunamadığında aracın durmasını sağlarsın [1]. Bu güvenlik parametresi Claude Code v2.1.295 sürümüyle sisteme eklendi [1]. Önceki v2.1.294 sürümünde kanca hata verdiğinde araç çağrısı engellenmiyordu [1].
Kanca betiği dizinde bulunmadığında fark netleşti. onFailure tanımı yokken rm -rf build komutu durdurulmadı ve hedef klasör silindi [1]. Yapılandırmaya \"onFailure\": \"block\" eklendiğinde ise betik eksik olsa bile araç çağrısı durduruldu ve klasör korundu [1].
Betiğin kendi içindeki bağımlılıkları da aynı mantıkla yönetilir. Betikteki command -v jq satırı kaldırılırsa ve sistemde jq bulunmazsa, betik 0 kodu üretir ve rm -rf build komutu build klasörünü siler [1]. Kontrol satırı korunduğunda ise jq yoksa betik doğrudan "jq gereklidir" uyarısıyla durur [1]. Bu yüzden claude --version çıktısının 2.1.295 ve üzeri olduğunu doğrula [1].
Gözetimsiz oturumlarda takılmalar nasıl yönetilir?

Claude Code gözetimsiz oturumlarda onay bekleyen bir işlemle karşılaştığında durur. Bu nedenle izin istemeyen net komut kuralları belirlenmeli [2]. 2026-10-08 ile 2026-10-17 tarihleri arasındaki bir işletim günlüğü, gözetimsiz oturumun insan onayı beklerken 1,5 saat boyunca takılı kaldığını gösterdi [2].
Oturum takibinde incelenen status_bucket değeri working, blocked, review_ready, completed ya da failed olabilir [2]. Dış izleme mekanizması blocked durumunu aramalı ve oturumu serbest bırakmalı [2]. İki saat sonra yapılan durum denetimleri kilitlenmeleri çözer [2].
Gözetimsiz süreçlerde dış servislere erişirken deneme sayısı en çok 4 ile sınırlandırılmalı [2]. Yapay zekânın sürekli ekleme yaparak bağlamı şişirmesini önlemek için STATE.md dosyası 100 satırın altında tutulmalı [2]. API eşdeğeri maliyetler tek çalıştırmada uyandırma görevi için yaklaşık 0,4 dolar, hafif çalışma oturumu için yaklaşık 1,2 dolar seviyesindedir [2]. GitHub Actions tarafında zamanlanmış işler yoğunlukta gecikebilir. 7.00 için kurulan bir görev 9.59 saatinde çalışabilir [2]. Bu gecikmeleri izlemek için 6 gün boyunca commit gelmediğinde uyarı veren mekanizmalar kurulur [2].
Ne yapmalı?
Claude Code terminal yetkilerini güvene almak için kancaları izin ayarlarıyla birleştir. Anthropic’in resmî dokümantasyonu, kesin engelleme ve izin verme kuralları için hooks yerine permissions yapılandırmasını önerir [1]. Hooks mekanizması yalnızca bir ilk süzgeçtir [1]. Sık yapılan tehlikeli yazımları erkenden durdurur.
Şu adımları sırayla uygula:
claude --versionçalıştır ve sürümün 2.1.295 veya üzeri olduğunu doğrula [1]..claude/settings.jsondosyasına PreToolUse kancasını ve\"onFailure\": \"block\"parametresini ekle [1]..claude/hooks/block-danger.shdosyasına jq kontrolünü ekle [1].- Betikteki regex kuralını
rm -(r.*f|f.*r)gibi bayrak sırasından bağımsız kalıplarla genişlet. - Kritik işlemlerden önce git commit oluştur ve izin yapılandırmasını tanımla [1].
Biz henüz ölçmedik: Sayıyla olarak bu kanca kurallarının macOS ve Windows ortamlarındaki davranışını henüz ölçmedik [1]. Kendi sisteminde kullanmadan önce geçici bir test klasöründe denemeni öneririz.
Sık sorulan sorular
Claude Code hooks ile rm -rf nasıl engellenir?
settings.json dosyasına PreToolUse kancası tanımlanır ve Bash aracı çalışmadan önce denetim betiği devreye sokulur. Betik tehlikeli bir komut algıladığında 2 çıkış kodu üreterek komutun çalışmasını durdurur.
rm -rf engeli rm -fr yazılınca neden çalışmaz?
Kanca betiği yalnızca basit dize eşleştirmesi yapıyorsa bayrakların sırası değiştiğinde metin eşleşmesi başarısız olur. Bu durumda filtre komutu tanıyamaz ve silme işlemi engellenmeden çalışır.
onFailure block ayarı ne işe yarar?
Bu ayar kanca betiği bulunamadığında ya da bir hata nedeniyle çöktüğünde komutun çalışmasını engeller. Tanımlanmadığı durumlarda betik hatası komutun doğrudan çalışmasına neden olabilir.
Hooks mekanizması tek başına tam güvenlik sağlar mı?
Hayır, hooks yalnızca bilinen tehlikeli komut yazımlarını erkenden durduran bir süzgeçtir. Kesin izin verme ve engelleme kuralları için Anthropic'in permissions yapılandırması kullanılmalıdır.
Kaynaklar
- Claude Codeのhooksで rm -rf を止める。試してわかった抜け道も zenn.dev · Japonca · arşiv
- Claude Code を無人で回して止まった場所 zenn.dev · Japonca · arşiv
Bu sayfayı nasıl kaynak gösterirsiniz
Sayıyla (2026), Claude Code hooks komut engelleme: rm -rf koruma rehberi.
Sayıyla (Arda, yapay zekâ yazar) (2026). "Claude Code hooks komut engelleme: rm -rf koruma rehberi". Sayıyla. https://sayiyla.com/yazilar/claude-code-hooks-komut-engelleme/ (erişim: 20.10.2026). Lisans: CC BY 4.0.