wget ile Dosya İndirme ve Site Yansılama

Terminal açıp bir dosya indirmeniz gerektiğinde aklınıza ilk gelen araç muhtemelen wget‘tir. Yıllar içinde sayısız sunucuda, sayısız farklı senaryoda kullandım ve her seferinde ne kadar güçlü bir araç olduğunu yeniden fark ettim. Sadece dosya indirmekle kalmaz, tüm bir web sitesini yansılayabilir, yarım kalan indirmeleri devam ettirebilir, kimlik doğrulama gerektiren sayfalara erişebilir ve hatta bir site arşivi oluşturabilirsiniz. Bu yazıda wget‘i gerçek sysadmin senaryolarıyla, derinlemesine inceleyeceğiz.

wget Nedir ve Neden Bu Kadar Popüler?

wget, GNU projesi tarafından geliştirilen, komut satırından HTTP, HTTPS ve FTP protokolleri üzerinden dosya indirmeyi sağlayan bir araçtır. İnteraktif olmayan yapısı sayesinde, yani kullanıcı etkileşimi gerektirmeden çalışabilmesi sayesinde, script’lerde ve zamanlanmış görevlerde (cron job) son derece kullanışlıdır.

curl ile sık sık karşılaştırılır ama ikisi farklı güçlere sahiptir. wget‘in en büyük avantajı recursive indirme yeteneğidir. Bir sitenin tamamını veya belirli bir dizin yapısını tek komutla indirebilirsiniz. curl daha çok API çağrıları ve veri transfer esnekliği konusunda öne çıkar.

Kurulum

Çoğu Linux dağıtımında wget önceden yüklü gelir. Gelmiyorsa:

# Debian/Ubuntu
sudo apt install wget

# RHEL/CentOS/Rocky Linux
sudo dnf install wget

# Arch Linux
sudo pacman -S wget

Temel Kullanım: Dosya İndirme

En basit kullanım şekliyle wget‘e sadece bir URL verirsiniz:

wget https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso

Bu komut, dosyayı bulunduğunuz dizine indirir ve indirme ilerleme çubuğunu gösterir. Ancak gerçek hayatta işler nadiren bu kadar basit olur. Hadi daha karmaşık senaryolara geçelim.

Dosyayı Farklı İsimle veya Konuma Kaydetme

# Farklı isimle kaydet
wget -O ubuntu-server.iso https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso

# Belirli bir dizine kaydet
wget -P /opt/isos/ https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso

# İkisini birleştir: belirli dizine, belirli isimle
wget -O /opt/isos/ubuntu-22.iso https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso

-O: Çıktı dosyasının adını belirler (büyük harf O) -P: İndirilen dosyaların kaydedileceği dizini belirler

Yarım Kalan İndirmeyi Devam Ettirme

Bu özelliği öğrendiğimde gerçekten hayatım kolaylaştı. Büyük dosyaları indirirken bağlantı koparsa veya sunucu timeout yaparsa:

wget -c https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso

-c (continue) parametresi, varsa kısmen indirilmiş dosyayı tespit eder ve kaldığı yerden devam eder. Özellikle zayıf bağlantılarda veya büyük dosyaları indirirken bu parametre hayat kurtarır.

Arka Planda İndirme ve Log Yönetimi

Sunucularda çalışırken terminal oturumunu açık tutmak istemezsiniz. wget‘i arka planda çalıştırabilirsiniz:

wget -b -o /var/log/wget-download.log https://example.com/largefile.tar.gz

-b: Arka planda çalıştırır (background) -o: Log dosyasının konumunu belirtir

İndirmenin durumunu kontrol etmek için:

tail -f /var/log/wget-download.log

ya da wget size işlem ID’sini verir, doğrudan kontrol edebilirsiniz:

cat wget-log

Sessiz Mod ve Script Entegrasyonu

Script’lerde wget kullanırken çıktıyı bastırmak isteyebilirsiniz:

# Tamamen sessiz mod
wget -q https://example.com/file.tar.gz

# Sadece hata mesajlarını göster
wget -nv https://example.com/file.tar.gz

-q: Sessiz mod, hiçbir çıktı üretmez -nv: Non-verbose, sadece kritik bilgileri gösterir

Kimlik Doğrulama ile İndirme

Şirket içi sunucularda veya korumalı kaynaklardan dosya indirirken kimlik doğrulaması gerekebilir:

# HTTP Basic Auth
wget --user=admin --password=gizli_sifre https://internal.company.com/backup.tar.gz

# Şifreyi terminal üzerinden girmek için (daha güvenli)
wget --user=admin --ask-password https://internal.company.com/backup.tar.gz

# FTP kimlik doğrulama
wget ftp://admin:[email protected]/files/data.zip

Güvenlik notu: Komut satırına şifre yazmak history dosyasında görünür. Mümkün olduğunda --ask-password kullanın veya ~/.wgetrc dosyasında kimlik bilgilerini saklayın.

.wgetrc ile Kimlik Bilgisi Yönetimi

# ~/.wgetrc dosyasına ekleyin
echo "user=admin" >> ~/.wgetrc
echo "password=gizli_sifre" >> ~/.wgetrc
chmod 600 ~/.wgetrc

Bu yöntemle kimlik bilgilerini komut satırında görünür hale getirmeden wget‘i kullanabilirsiniz.

Toplu İndirme: Dosya Listesinden İndirme

Diyelim ki 50 farklı URL’den dosya indirmeniz gerekiyor. Hepsini tek tek yazmak yerine bir liste dosyası oluşturun:

# urls.txt dosyasını oluşturun
cat > urls.txt << EOF
https://example.com/file1.tar.gz
https://example.com/file2.tar.gz
https://another-site.com/package.deb
https://releases.example.org/software-v1.0.zip
EOF

# Listedeki tüm dosyaları indir
wget -i urls.txt

# Belirli bir dizine indir
wget -i urls.txt -P /opt/downloads/

-i: Belirtilen dosyadaki URL listesinden indirir

Bu özelliği özellikle paket yönetimi, yazılım dağıtımı ve veri toplama script’lerinde sık kullanıyorum.

Site Yansılama: wget’in Gerçek Gücü

wget‘in en güçlü özelliğine geldik. Recursive indirme ile bir web sitesini veya FTP sunucusunu tamamen yerel diskinize kopyalayabilirsiniz.

Temel Recursive İndirme

wget -r https://docs.example.com/

-r (recursive): Sayfadaki linkleri takip ederek indirir. Varsayılan derinlik 5’tir.

Ancak bu komut kontrolsüz çalıştırılırsa tehlikeli olabilir. Sitenin dışına çıkabilir, sonsuz döngüye girebilir. Bu yüzden genellikle ek parametrelerle kullanılır.

Komple Site Yansılama

Offline bir site kopyası oluşturmak için kullanılan klasik komut:

wget --mirror 
     --convert-links 
     --adjust-extension 
     --page-requisites 
     --no-parent 
     -P /var/www/mirror/ 
     https://docs.example.com/

Bu parametreleri tek tek açıklayalım:

–mirror: -r -N -l inf --no-remove-listing kombinasyonuna eşdeğerdir. Zaman damgalarını kontrol eder, değişen dosyaları günceller –convert-links: İndirilen HTML dosyalarındaki linkleri yerel dosya yollarına dönüştürür, offline gezinmeyi mümkün kılar –adjust-extension: HTML içeriği olan dosyalara .html uzantısı ekler –page-requisites: Sayfayı düzgün görüntülemek için gereken CSS, JS, resim gibi tüm dosyaları indirir –no-parent: Üst dizinlere çıkmaz, belirtilen URL’nin altındaki içerikle sınırlı kalır

Derinliği Sınırlama

Sonsuz recursive indirmeyi önlemek için:

# Maksimum 3 seviye derinlikte in
wget -r -l 3 https://example.com/docs/

# Sadece bir sayfa, recursive yok
wget -r -l 1 https://example.com/

-l: Recursive indirmenin maksimum derinliğini belirler

Belirli Dosya Türlerini İndirme veya Hariç Tutma

# Sadece PDF dosyalarını indir
wget -r -A "*.pdf" https://example.com/docs/

# Sadece belirli uzantıları indir
wget -r -A "*.pdf,*.doc,*.xlsx" https://example.com/

# Belirli dosya türlerini hariç tut
wget -r -R "*.jpg,*.png,*.gif" https://example.com/

# Belirli dizinleri hariç tut
wget -r --exclude-directories=/images,/videos https://example.com/

-A: Kabul edilecek dosya uzantıları veya desenleri (Accept) -R: Reddedilecek dosya uzantıları veya desenleri (Reject) –exclude-directories: Belirtilen dizinleri atlar

Gerçek Dünya Senaryoları

Senaryo 1: Şirket İç Dokümantasyonunu Yansılama

Ekibim bir kez bir proje tesliminden önce internet erişiminin kesileceğini öğrendi. Kullandığımız framework’ün dokümantasyonunu offline erişim için yansılamam gerekti:

#!/bin/bash
# Dokümantasyon yansılama scripti

MIRROR_DIR="/opt/docs-mirror"
DOC_URL="https://framework-docs.example.com"
LOG_FILE="/var/log/doc-mirror.log"

mkdir -p $MIRROR_DIR

wget --mirror 
     --convert-links 
     --adjust-extension 
     --page-requisites 
     --no-parent 
     --wait=1 
     --random-wait 
     --user-agent="Mozilla/5.0" 
     -P $MIRROR_DIR 
     -o $LOG_FILE 
     $DOC_URL

echo "Yansılama tamamlandı: $(date)" >> $LOG_FILE

–wait: İstekler arasında bekleme süresi (saniye). Sunucuyu yüklememek için –random-wait: Bekleme süresini rastgele yapar (0.5x ile 1.5x arasında) –user-agent: Tarayıcı kimliğini taklit eder, bazı siteler wget’i engelleyebilir

Senaryo 2: FTP Sunucusundan Yedek Alma

#!/bin/bash
# FTP sunucusundan günlük yedek alma

BACKUP_DIR="/backup/ftp-$(date +%Y%m%d)"
FTP_USER="backup_user"
FTP_PASS="sifre123"
FTP_HOST="ftp.internal.company.com"

mkdir -p $BACKUP_DIR

wget -r 
     --ftp-user=$FTP_USER 
     --ftp-password=$FTP_PASS 
     --no-passive-ftp 
     -P $BACKUP_DIR 
     ftp://$FTP_HOST/backups/

# İndirme başarılı mı?
if [ $? -eq 0 ]; then
    echo "FTP yedek alma başarılı: $(date)"
    # Eski yedekleri temizle (30 günden eski)
    find /backup/ -name "ftp-*" -mtime +30 -exec rm -rf {} ;
else
    echo "HATA: FTP yedek alma başarısız: $(date)" >&2
    exit 1
fi

Senaryo 3: SSL Sertifika Sorunlarını Aşma (Test Ortamları İçin)

Test ortamlarında self-signed sertifikalarla karşılaşmak normaldir:

# SSL doğrulamayı atla (SADECE test ortamı için!)
wget --no-check-certificate https://test-server.internal/file.tar.gz

# Belirli bir CA sertifikası kullan
wget --ca-certificate=/etc/ssl/certs/company-ca.crt https://internal.company.com/file

Uyarı: --no-check-certificate üretim ortamında kesinlikle kullanmayın. Ortadaki adam saldırılarına (MITM) karşı savunmasız kalırsınız.

Senaryo 4: Bant Genişliği Sınırlama

Sunucu üretimde çalışırken ağı tıkamamak için:

# İndirmeyi 500 KB/s ile sınırla
wget --limit-rate=500k https://example.com/largefile.tar.gz

# 1 MB/s limit
wget --limit-rate=1m https://example.com/largefile.tar.gz

–limit-rate: İndirme hızını sınırlar. k (kilobyte), m (megabyte) birimi kullanabilirsiniz.

Proxy Kullanımı

Kurumsal ağlarda proxy üzerinden geçmek gerekebilir:

# HTTP proxy
wget -e use_proxy=yes -e http_proxy=proxy.company.com:8080 https://example.com/file

# Proxy kimlik doğrulama ile
wget --proxy-user=kullanici --proxy-password=sifre 
     -e use_proxy=yes 
     -e http_proxy=proxy.company.com:8080 
     https://example.com/file

# Ortam değişkeniyle proxy ayarı
export http_proxy="http://proxy.company.com:8080"
export https_proxy="http://proxy.company.com:8080"
wget https://example.com/file

Zaman Aşımı ve Yeniden Deneme Ayarları

Güvenilmez ağ bağlantılarında veya yavaş sunucularda:

wget --timeout=30 
     --tries=5 
     --retry-connrefused 
     --waitretry=10 
     https://flaky-server.example.com/file.tar.gz

–timeout: Bağlantı ve okuma zaman aşımı (saniye) –tries: Başarısız denemeler için yeniden deneme sayısı (0 sonsuz) –retry-connrefused: Bağlantı reddedilse bile yeniden dener –waitretry: Yeniden denemeler arasındaki bekleme süresi (saniye)

Tam Güvenilir İndirme Script’i

#!/bin/bash
# Sağlam dosya indirme fonksiyonu

download_file() {
    local url=$1
    local dest=$2
    local max_tries=${3:-5}

    echo "İndiriliyor: $url"

    wget 
        --continue 
        --timeout=60 
        --tries=$max_tries 
        --retry-connrefused 
        --waitretry=30 
        --progress=bar:force 
        --server-response 
        -O "$dest" 
        "$url"

    local exit_code=$?

    if [ $exit_code -eq 0 ]; then
        echo "Başarıyla indirildi: $dest"
        return 0
    else
        echo "İndirme başarısız! Çıkış kodu: $exit_code"
        rm -f "$dest"
        return 1
    fi
}

# Kullanım
download_file "https://example.com/package.tar.gz" "/opt/packages/package.tar.gz" 3

wget ile Sayfa İçeriği Kontrolü

Sadece dosya indirmekle kalmaz, sayfa içeriğini analiz etmek veya HTTP başlıklarını kontrol etmek için de kullanabilirsiniz:

# Sadece HTTP başlıklarını kontrol et (dosyayı indirmeden)
wget --server-response --spider https://example.com/file.tar.gz

# Sayfa içeriğini stdout'a yaz
wget -O - https://api.example.com/health

# Checksum doğrulama ile indirme
wget https://example.com/software.tar.gz
wget https://example.com/software.tar.gz.sha256
sha256sum -c software.tar.gz.sha256

–spider: Dosyayı indirmez, sadece erişilebilirliği kontrol eder –server-response: HTTP sunucu yanıt başlıklarını gösterir

Bu özelliği monitoring script’lerinde sık kullanıyorum. Bir URL’nin erişilebilir olup olmadığını, hangi HTTP kodunu döndürdüğünü kontrol etmek için --spider son derece kullanışlıdır.

Önemli Parametreler Özeti

Sık kullandığım en önemli parametreler:

-O dosya: Çıktıyı belirtilen dosyaya yazar -P dizin: İndirilen dosyaları belirtilen dizine kaydeder -c: Yarım kalan indirmeyi devam ettirir -b: Arka planda çalıştırır -q: Sessiz mod -r: Recursive indirme -l sayı: Recursive derinlik limiti –mirror: Tam yansılama modu –convert-links: Linkleri yerel yollara dönüştürür –no-parent: Üst dizine çıkmaz -A liste: Kabul edilecek dosya türleri -R liste: Reddedilecek dosya türleri –limit-rate=hız: İndirme hızını sınırlar –timeout=saniye: Zaman aşımı süresi –tries=sayı: Yeniden deneme sayısı –wait=saniye: İstekler arası bekleme –user-agent=metin: Tarayıcı kimliğini taklit eder –no-check-certificate: SSL doğrulamayı atlar (dikkatli kullanın) –spider: Dosya indirmeden erişilebilirlik kontrolü

Yaygın Sorunlar ve Çözümleri

Robots.txt engellemesi: Bazı siteler wget’i engeller. --execute robots=off ile aşabilirsiniz, ancak sitenin kullanım şartlarına dikkat edin.

User-agent engellemesi: --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" ile bir tarayıcı gibi görünebilirsiniz.

Çok fazla bağlantı: --wait ve --random-wait parametrelerini kullanarak sunucuya saygılı olun. Agresif indirme IP yasaklamasına yol açabilir.

SSL sorunları: Sertifika zinciri eksikse --ca-certificate ile doğru CA dosyasını belirtin.

Sonuç

wget, bir sysadmin’in araç kutusunda mutlaka bulunması gereken, görünürde basit ama derinlerde son derece güçlü bir araçtır. Tek bir dosyayı indirmekten, bir sitenin tamamını yansılamaya, FTP’den yedek almaktan, monitoring script’leri yazmaya kadar geniş bir kullanım yelpazesi sunar.

Ben özellikle üç senaryoda wget‘e güveniyorum: büyük dosyaları güvenilir şekilde indirmem gerektiğinde (-c ile kurtarma imkanı), dokümantasyon sitelerini offline kullanım için yansılarken ve cron job’larda rutin indirme görevlerini otomatikleştirirken. Bu yazıda anlattığım parametreleri ve script’leri kendi ortamınıza uyarlayarak kullanabilirsiniz.

Son bir not: wget güçlü ama sorumluluk sahibi kullanılmalıdır. Bir siteyi agresif şekilde yansılamak, o sitenin sunucusuna ekstra yük bindirip servis dışı kalmasına neden olabilir. --wait, --random-wait ve --limit-rate parametrelerini kullanmak hem etik açıdan doğrudur hem de IP yasaklamasından korunmanızı sağlar.

Yorum yapın