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.