TL;DR
| Konu | 2019 | 2026 |
|---|---|---|
| Sürüm | wget 1.20.x | Wget2 2.2.1 / wget 1.25.0 |
| Protokol | HTTP/1.1 | HTTP/2 (Wget2) |
| İndirme | Tek kanal | Çok kanallı (5 iş parçacığı) |
| Sıkıştırma | gzip, deflate | brotli, zstd, lzip, xz |
| TLS | TLS 1.2 yaygın | TLS 1.3 zorunlu |
| HSTS | Temel | Tam RFC 6797 (Wget2) |
| Bot Koruması | User-Agent yeterli | JA3 parmak izi, JS challenge |
Bu yazının ilk versiyonu 2019 yılında yayınlanmıştı. O tarihten bu yana internetin protokol seviyesinde yaşadığı dönüşüm (HTTP/2, TLS 1.3), bot koruma ekosistemindeki gelişmeler ve Wget2’nin stabil hale gelmesi, wget’i sadece “dosya indiren araç” olmaktan çıkarıp modern web mimarisine uyum sağlaması gereken bir uç noktaya dönüştürdü.
wget Temelleri
GNU Wget, internet üzerinden komut satırı kullanarak dosya indirmeyi sağlayan bir indirme yöneticisidir. Adı World Wide Web ve get kelimelerinden türetilmiştir. HTTP, HTTPS ve FTP protokolleri üzerinden indirme işlemleri gerçekleştirebilmekte; özyinelemeli (recursive) site indirme, kesintili indirmeyi devam ettirme ve bant genişliği sınırlandırma gibi temel işlevler sunmaktadır1.
En temel kullanımı:
wget [URL]
Sık Kullanılan Parametreler
| Parametre | Açıklama | Örnek |
|---|---|---|
-O | Çıktı dosya adı belirt | wget -O veri.zip [URL] |
-c | Yarım kalan indirmeyi devam ettir | wget -c [URL] |
-r | Özyinelemeli indirme | wget -r [URL] |
-m | Site kopyalama (mirror) | wget -m [URL] |
-P | Hedef dizin belirt | wget -P /indirilen/ [URL] |
-i | Dosya listesinden indir | wget -i liste.txt |
-q | Sessiz mod (çıktı yok) | wget -q [URL] |
--limit-rate | Bant genişliği sınırla | wget --limit-rate=500k [URL] |
-A | Yalnızca belirli türleri indir | wget -r -A jpg,png [URL] |
-R | Belirli türleri hariç tut | wget -r -R tar.gz [URL] |
--user-agent | User-Agent string’i belirt | wget --user-agent="..." [URL] |
-np | Üst dizine çıkma | wget -r -np [URL] |
Site Kopyalama (Mirror)
wget’in en güçlü özelliklerinden biri, bir web sitesinin çevrimdışı kopyasını oluşturabilmesidir:
wget --mirror --convert-links --page-requisites --no-parent \
-P ./site-kopyasi https://ornek.com/dokumantasyon/
--convert-links parametresi, indirilen HTML dosyalarındaki bağlantıları yerel yollara dönüştürerek çevrimdışı görüntülemeyi mümkün kılmakta. Bu özellik, curl’ün sunmadığı ve wget’i belirli senaryolarda vazgeçilmez kılan bir kapasitedir.
Wget2: Sessiz Devrim
2019’dan bu yana wget ekosistemindeki en önemli gelişme, orijinal wget’in halefi olan Wget2’nin stabil hale gelmesidir. En güncel sürümü 2.2.1 (Ocak 2026) ile aktif geliştirmeye devam etmekte2.
wget vs Wget2
| Özellik | wget (1.x) | Wget2 (2.x) |
|---|---|---|
| HTTP/2 | Desteklenmez | Tam destek (nghttp2) |
| Çok kanallı indirme | Yok | Varsayılan 5 iş parçacığı |
| Sıkıştırma | gzip, deflate | brotli, zstd, lzip, bzip2, xz |
| HSTS | Temel | Tam RFC 6797, varsayılan açık |
| HPKP | Yok | RFC 7469 (kalıcı veritabanı) |
| TCP Fast Open | Yok | Destekleniyor |
| TLS Session Resumption | Yok | Kalıcı önbellek ile |
| Tek dosya parçalı indirme | Yok | --chunk-size ile |
| RSS/Atom/Sitemap | Yok | Destekleniyor |
| FTP | Tam destek | Sınırlı |
| WARC çıktı | Destekleniyor | Henüz yok |
Çok Kanallı İndirme
Wget2’nin en belirgin avantajı, çok kanallı (multi-threaded) indirme desteğidir. Orijinal wget dosyaları tek kanal üzerinden indirirken, Wget2 varsayılan olarak 5 eşzamanlı bağlantı kullanmakta:
# Paralel indirme (varsayılan 5 iş parçacığı)
wget2 https://ornek.com/buyuk-dosya.tar.gz
# Tek dosyayı parçalara bölerek indir
wget2 --chunk-size=10M https://ornek.com/buyuk-dosya.tar.gz
--chunk-size parametresi, tek bir büyük dosyayı belirtilen boyutta parçalara ayırarak paralel indirme sağlamakta. Bu özellik, yüksek bant genişliğine sahip bağlantılarda belirgin performans artışı sunmakta.
HTTP/2 Desteği
Wget2, nghttp2 ve GnuTLS ALPN üzerinden tam HTTP/2 desteği sunmakta. HTTP/2’nin çoğullama (multiplexing) özelliği sayesinde tek bir TCP bağlantısı üzerinden birden fazla istek aynı anda gönderilebilmekte:
# HTTP/2 otomatik kullanılır (sunucu destekliyorsa)
wget2 https://ornek.com/dosya.zip
HTTP/3 (QUIC) desteği Wget2’nin geliştirme dalında (branch) mevcut ancak henüz stabil sürüme dahil edilmemiştir.
Sıkıştırma Desteği
Wget2, brotli ve zstd dahil modern sıkıştırma algoritmalarını desteklemekte. Accept-Encoding başlığı otomatik olarak desteklenen algoritmaları bildirmekte:
# Desteklenen algoritmalar: brotli, zstd, lzip, bzip2, xz, gzip, deflate
wget2 --compression=zstd https://ornek.com/veri.json
Dağıtım Desteği
Fedora 40 ve sonrasında Wget2, wget2-wget paketi ile varsayılan wget komutu olarak gelmekte3. Bu durum, Wget2’nin üretim ortamı için hazır olduğunun en güçlü göstergesi. Debian, Ubuntu, Alpine ve Arch Linux depolarında da mevcut:
# Fedora (varsayılan olarak gelir)
dnf install wget2-wget
# Debian/Ubuntu
apt install wget2
# macOS
brew install wget2
Güvenlik ve Modern TLS
2019’da TLS 1.1 ve 1.2 yaygınken, 2026 itibarıyla TLS 1.3 standart haline geldi. Bu değişim wget ekosistemini de doğrudan etkilemekte.
TLS 1.3 Desteği
wget 1.19.5’ten bu yana GnuTLS üzerinden TLS 1.3 desteklemekte. wget 1.21.3 ile komut satırından TLS sürümü seçimi de mümkün hale geldi. Wget2 ise TLS False Start ve kalıcı önbellekli TLS Session Resumption ile daha ileri güvenlik özellikleri sunmakta4.
HSTS (HTTP Strict Transport Security)
Wget2, RFC 6797 uyumlu tam HSTS desteğini varsayılan olarak etkinleştirmekte ve kalıcı veritabanında HSTS bilgilerini saklamakta. Bu sayede bir site “beni yalnızca HTTPS üzerinden çağır” talimatı verdiğinde, sonraki isteklerde otomatik olarak HTTPS’e yönlendirme yapılmakta.
--no-check-certificate Artık Kötü Pratik
Let’s Encrypt’in yaygınlaşmasıyla birlikte, geçerli TLS sertifikası olmayan sunucu sayısı belirgin şekilde azaldı. --no-check-certificate sertifika doğrulamasını tamamen devre dışı bırakarak ortadaki adam (MITM) saldırılarına kapı açmakta:
# Kötü pratik
wget --no-check-certificate https://ornek.com/dosya.zip
# Doğru yaklaşım: Sistem sertifikalarını güncelle
sudo update-ca-certificates
# Veya özel CA dosyası belirt
wget --ca-certificate=/yol/ca-bundle.crt https://ornek.com/dosya.zip
Güvenlik Açıkları
| CVE | CVSS | Etkilenen | Açıklama |
|---|---|---|---|
| CVE-2024-38428 | 9.1 (Kritik) | wget 1.24.5 ve öncesi | URI ayrıştırmada noktalı virgül, ana bilgisayar ayırıcısı olarak yorumlanarak SSRF’e yol açmakta5 |
| CVE-2024-10524 | Orta | wget 1.24.5 ve öncesi | HTTP kısayol SSRF açığı, 1.25.0 ile düzeltildi |
| CVE-2025-69194 | 8.8 (Yüksek) | Wget2 | Metalink dosya üzerine yazma açığı, 2.2.1 ile düzeltildi6 |
wget 1.25.0 (Kasım 2024) bu açıkları yamalarken, önemli bir kırılma değişikliği de getirmiştir: kısayol URL formatı (wget kullanici:sifre@sunucu) kaldırılmış; tam URL belirtilmesi zorunlu hale gelmiştir.
Bot Korumalarını Anlamak
E-ticaret siteleri ve veri kaynakları, wget gibi araçları tespit etmek için giderek daha agresif korumalar kullanmakta. Modern bot tespit sistemleri dört katmanda çalışmakta7:
1. User-Agent Analizi
wget varsayılan olarak Wget/1.25.0 (veya Wget2/2.2.1) string’i göndermekte. Bu string, Cloudflare ve Akamai gibi WAF sistemleri tarafından anında tanınmakta:
# Bloklanma riski yüksek
wget https://ornek.com/veri.csv
# Modern tarayıcı string'i ile
wget --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0" \
https://ornek.com/veri.csv
2. TLS/JA3 Parmak İzi
Modern bot koruma sistemleri, TLS el sıkışması (handshake) sırasında gönderilen şifreleme paketleri, uzantılar ve TLS sürümünden oluşan benzersiz bir “JA3 parmak izi” oluşturmakta. wget ve curl’ün parmak izleri, tarayıcılardan farklı olup anti-bot servisleri bu parmak izlerinin veritabanlarını tutmakta.
3. HTTP/2 Çerçeve Sıralaması
HTTP/2 destekleyen araçlar bile (curl, httpx) çerçeve sıralaması ve ayarları üzerinden parmak izi alınabilmekte.
4. JavaScript Challenge
wget JavaScript çalıştıramadığından, Cloudflare Turnstile veya Akamai sensor data gibi JS tabanlı korumalar wget’i tamamen engellemekte.
İnsansı Davranış Stratejisi
wget --continue --tries=10 \
--wait=2 --random-wait \
--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0" \
--limit-rate=500k \
[URL]
--random-wait parametresi, --wait ile belirtilen sürenin 0.5x ile 1.5x arasında rastgele bir değerini kullanarak istek zamanlamasını insansı hale getirmekte. --limit-rate ise hedef sunucuyu yormamak için bant genişliğini sınırlandırmakta.
robots.txt: wget, özyinelemeli indirmelerde robots.txt dosyasını varsayılan olarak okumakta. Etik sınırlar dahilinde analiz yapılıyorsa -e robots=off ile devre dışı bırakılabilir, ancak bu yaklaşım sorumlu kullanım gerektirir.
wget vs curl: 2026 Perspektifi
Geliştirici dünyasında wget ve curl sıklıkla karşılaştırılmakta, ancak iki araç farklı felsefeler üzerine inşa edilmiştir8.
Protokol Desteği
| Protokol | curl | wget (1.x) | Wget2 |
|---|---|---|---|
| HTTP/1.x | Evet | Evet | Evet |
| HTTP/2 | Evet | Hayır | Evet |
| HTTP/3 (QUIC) | Deneysel | Hayır | Geliştirmede |
| FTP/FTPS | Evet | Evet | Sınırlı |
| SCP/SFTP | Evet | Hayır | Hayır |
| SMTP/POP3/IMAP | Evet | Hayır | Hayır |
| Toplam protokol | ~26 | 3 | ~3 |
Felsefi Fark
curl, cat gibi boru hattı odaklı bir araçtır: veriyi stdout’a yazar, diğer araçlarla zincirlenir. wget ise cp gibi dosya kopyalama odaklıdır: dosyayı diske yazar, kesintide devam eder, dizin yapısını korur.
curl’ün arkasında libcurl kütüphanesi bulunmakta ve binlerce uygulama tarafından kullanılmakta. Wget2’nin libwget kütüphanesi henüz bu yaygınlığa ulaşmamıştır.
Hangi Durumda Hangisi?
| Senaryo | wget / Wget2 | curl |
|---|---|---|
| Özyinelemeli site indirme | --mirror, --convert-links | Desteklemez |
| Çevrimdışı site kopyası | --mirror -p --convert-links | Desteklemez |
| Kesintili büyük dosya | -c (devam ettirme) | --continue-at - |
| API testi | Sınırlı | Tam destek (tüm HTTP metodları) |
| JSON gönderme/alma | Zor | --json, -d |
| Boru hattı entegrasyonu | -O - ile mümkün | Varsayılan (stdout) |
| Çoklu protokol | HTTP/FTP | 26 protokol |
| Liste bazlı indirme | -i liste.txt | Desteklemez |
Kısaca: dosya indirme ve site kopyalama için wget, API etkileşimi ve boru hattı operasyonları için curl.
Modern Alternatifler
aria2
aria2, çoklu protokol (HTTP, FTP, SFTP, BitTorrent, Metalink) ve çoklu kaynak indirme desteği sunan hafif bir indirme yöneticisidir9. En güncel sürümü 1.37.0 (Kasım 2023). Tek bir dosyayı birden fazla kaynaktan aynı anda indirerek hızı artırabilmekte. JSON-RPC ve XML-RPC arayüzü ile uzaktan kontrol edilebilmekte:
# Çoklu kaynak indirme
aria2c -x 16 https://ornek.com/buyuk-dosya.tar.gz
# BitTorrent
aria2c dosya.torrent
# RPC modu (web arayüzü ile kontrol)
aria2c --enable-rpc
aria2, saf indirme performansında (özellikle çoklu kaynak ve torrent) öne çıkarken, wget2 web tarama (crawling), site kopyalama ve modern HTTP özellikleri (HTTP/2, brotli) konusunda avantajlı konumda.
curl-impersonate
Modern bot korumalarını aşmak için geliştirilen curl-impersonate, curl’ün bir fork’udur ve tarayıcı TLS parmak izlerini taklit etmekte. JA3 tabanlı tespitlere karşı etkili bir çözüm sunmakta.
Karşılaştırma Tablosu
| Araç | HTTP/2 | Çok Kanallı | Özyinelemeli | BitTorrent | Sıkıştırma |
|---|---|---|---|---|---|
| wget 1.x | Hayır | Hayır | Evet | Hayır | gzip |
| Wget2 | Evet | Evet (5) | Evet | Hayır | brotli, zstd |
| curl | Evet | Hayır | Hayır | Hayır | brotli, zstd |
| aria2 | Hayır | Evet (16) | Hayır | Evet | Hayır |
Python subprocess Entegrasyonu
wget’i Python’dan çağırmak, belirli senaryolarda anlamlı bir yaklaşım olabilir. Ancak varsayılan olarak native Python kütüphaneleri tercih edilmelidir.
subprocess ile wget Ne Zaman Anlamlı?
Özyinelemeli site indirme: wget’in --mirror özelliğini Python kütüphaneleri yeterince karşılayamamakta:
import subprocess
# Site kopyalama
result = subprocess.run([
"wget", "--mirror", "--convert-links",
"--page-requisites", "--no-parent",
"-P", "./site-kopyasi",
"https://ornek.com/dokumantasyon/"
], capture_output=True, text=True, timeout=600)
Kesintili büyük dosya transferi: wget’in -c parametresi savaş alanında test edilmiş bir mekanizma:
import subprocess
result = subprocess.run([
"wget", "-c", "--tries=10",
"--limit-rate=500k",
"-O", "veri.tar.gz",
"https://ornek.com/buyuk-veri.tar.gz"
], capture_output=True, text=True, timeout=3600)
Native Python Kütüphaneleri Ne Zaman Tercih Edilmeli?
API etkileşimi, asenkron istek yönetimi ve yanıt verilerinin doğrudan işlenmesi gereken senaryolarda native kütüphaneler daha uygundur:
import httpx
# HTTP/2 destekli asenkron istek
async with httpx.AsyncClient(http2=True) as client:
response = await client.get("https://api.ornek.com/veri")
data = response.json()
Kütüphane Karşılaştırması
| Kütüphane | Asenkron | HTTP/2 | En Uygun Senaryo |
|---|---|---|---|
| requests | Hayır | Hayır | Basit betikler, hızlı otomasyon |
| httpx | Evet | Evet | Modern asenkron kod, HTTP/2 |
| aiohttp | Evet | Hayır | Yüksek eşzamanlılık |
| subprocess+wget | Hayır | Hayır (wget1), Evet (wget2) | Özyinelemeli indirme, site kopyalama |
| subprocess+aria2 | RPC ile | Hayır | Çoklu kaynak, torrent |
Pipeline Yaklaşımı
wget ile indirilen dosyaları doğrudan bir veri işleme hattına sokmak istediğinizde subprocess ile sarmalama mantıklı hale gelmekte:
import subprocess
import pandas as pd
from pathlib import Path
def indir_ve_isle(url: str, hedef: Path) -> pd.DataFrame:
"""wget ile indir, ardından pandas ile işle."""
result = subprocess.run(
["wget", "-q", "-O", str(hedef), url],
capture_output=True, text=True, timeout=120
)
if result.returncode != 0:
raise RuntimeError(f"wget hatası: {result.stderr}")
return pd.read_csv(hedef)
# Kullanım
df = indir_ve_isle(
"https://veri.ornek.com/dataset.csv",
Path("/tmp/dataset.csv")
)
Bu yaklaşım, wget’in kesintili indirme ve bant genişliği kontrolü özelliklerini Python’un veri işleme yetenekleriyle birleştirmekte.
2026 Best Practice Rehberi
Modern wget Komutu
wget --continue --tries=10 \
--wait=2 --random-wait \
--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0" \
--limit-rate=500k \
[URL]
Wget2 ile Modern İndirme
wget2 --chunk-size=10M --progress=bar \
https://ornek.com/buyuk-dosya.tar.gz
Güvenli Site Kopyalama
wget --mirror --convert-links --page-requisites \
--no-parent --wait=1 --random-wait \
--user-agent="Mozilla/5.0 Chrome/120.0.0.0" \
-P ./site-kopyasi https://ornek.com/
Güvenlik Kontrol Listesi
# Sürüm kontrolü
wget --version | head -1
# wget2 varsa tercih et
wget2 --version 2>/dev/null && echo "wget2 mevcut"
# --no-check-certificate KULLANMA
# Bunun yerine sistem sertifikalarını güncelle
sudo update-ca-certificates
Sonuç
wget, GNU ekosisteminin temel indirme aracı olarak konumunu korumakta. Ancak modern web mimarisinin gereksinimleri (HTTP/2, TLS 1.3, bot korumaları), orijinal wget’in kapasitelerini aşmış durumda. Wget2, çok kanallı indirme, brotli/zstd sıkıştırma ve tam HSTS desteğiyle bu boşluğu doldurmakta ve Fedora’nın varsayılan wget olarak benimsemesiyle üretim ortamı için hazır olduğunu kanıtlamakta.
Geliştirici iş akışlarında wget ve curl birbirinin alternatifi değil, tamamlayıcısıdır. Site kopyalama ve büyük dosya indirme için wget, API etkileşimi ve boru hattı operasyonları için curl kullanılmalıdır. Python ekosisteminde ise subprocess ile wget entegrasyonu, özyinelemeli indirme ve kesintili transfer senaryolarında anlamlı bir yaklaşım olarak öne çıkmakta.
wget ile ilişkili diğer konular hakkında rsync, grep, crontab ve veri kazıma yazılarına göz atabilirsiniz.
Footnotes
- GNU Wget ↩
- GNU Wget2 2.2.1 Release ↩
- Fedora Wget2asWget Change ↩
- rsync 3.2.0 NEWS - TLS ve sıkıştırma referansı ↩
- CVE-2024-38428 - JFrog Analysis ↩
- CVE-2025-69194 - Wget2 Metalink Vulnerability ↩
- Cloudflare User Agent Blocking ↩
- curl vs wget - Daniel Stenberg ↩
- aria2 - Multi-protocol Download Utility ↩