Sunucu yönetiminde, script yazarken ya da sadece bir dosyayı hızlıca indirmeniz gerektiğinde wget hayat kurtaran araçların başında gelir. Grafik arayüz olmayan bir sunucuda çalışıyorsunuz, bir ISO indirmeniz lazım, ya da otomatik yedekleme scriptinize dosya indirme özelliği eklemek istiyorsunuz. İşte tam bu anlarda wget devreye girer ve işinizi sessiz sedasız halleder.
wget Nedir ve Neden Kullanmalısınız?
wget, GNU projesi tarafından geliştirilen, komut satırından dosya indirmeye yarayan ücretsiz bir araçtır. HTTP, HTTPS ve FTP protokollerini destekler. Ağ bağlantısı kesilse bile kaldığı yerden devam edebilir, arka planda çalışabilir ve hatta tüm web sitelerini recursive olarak indirebilir.
curl ile sık sık karşılaştırılır ama ikisinin felsefesi biraz farklıdır. curl daha çok veri transferi ve API çağrıları için tercih edilirken, wget özellikle dosya indirme ve web site mirroring konusunda daha güçlüdür. İkisini de bilmek iyi bir sysadmin için şart, ama bu yazıda odağımız wget.
Kurulum
Çoğu Linux dağıtımında wget zaten kurulu gelir. Eğer kurulu değilse:
# Debian/Ubuntu
sudo apt install wget
# RHEL/CentOS/Rocky Linux
sudo dnf install wget
# Arch Linux
sudo pacman -S wget
# macOS (Homebrew ile)
brew install wget
Versiyon kontrolü yapmak için:
wget --version
Temel Kullanım
En basit kullanımı şu şekildedir:
wget https://example.com/dosya.zip
Bu komut dosyayı bulunduğunuz dizine indirir ve ilerlemeyi terminale yansıtır. Basit ama etkili.
Farklı Bir İsimle Kaydetmek
Bazen indirdiğiniz dosyanın URL’deki ismi yerine kendi belirlediğiniz bir isimle kaydedilmesini istersiniz:
wget -O yedek_dosya.zip https://example.com/backup_20240115_v2_final.zip
-O parametresi (büyük harf O) çıktı dosyasının adını belirtir. Dikkat edin, küçük harf -o loglama için kullanılır, büyük harf -O ise çıktı dosyası için. Bu ikisini karıştırmak çok yaygın bir hata.
Belirli Bir Dizine İndirmek
wget -P /tmp/downloads/ https://example.com/dosya.tar.gz
-P parametresi hedef dizini belirtir. Dizin yoksa otomatik oluşturulmaz, önceden var olması gerekir.
Kesilen İndirmelere Devam Etmek
Büyük dosyalar indirirken bağlantı kopabilir. wgetin en değerli özelliklerinden biri kaldığı yerden devam edebilmesidir:
wget -c https://example.com/büyük_dosya.iso
-c parametresi (continue) sunucunun range request desteklemesi şartıyla kaldığı yerden devam eder. Bir Ubuntu ISO indirirken bağlantınız kesilirse aynı komutu tekrar çalıştırmanız yeterli.
Gerçek dünya senaryosu olarak şunu düşünün: 4 GB’lık bir veritabanı dump’ı indiriyorsunuz, %80’de ağ düştü. -c olmadan baştan başlamak zorunda kalırsınız. -c ile kaldığı yerden devam eder ve zaman kaybetmezsiniz.
Arka Planda İndirme
Sunucularda çalışırken terminal penceresini kapatıp işin devam etmesini istersiniz. Bunun için:
wget -b https://example.com/büyük_dosya.iso
-b parametresi işlemi arka plana atar ve wget-log adlı bir dosyaya log yazar. İlerlemeyi takip etmek için:
tail -f wget-log
SSH üzerinden bağlandığınızda ve uzun sürecek bir indirme başlatmanız gerektiğinde bu yöntem işe yarar. Alternatif olarak screen ya da tmux içinde çalıştırmak da iyi bir pratiktir.
Bant Genişliği Limitleme
Üretim sunucusunda çalışırken büyük bir dosya indirmeniz gerekiyor ama ağ trafiğini de boğmak istemiyorsunuz. --limit-rate parametresi tam bunun için var:
wget --limit-rate=1m https://example.com/büyük_dosya.iso
Değer olarak k (kilobyte), m (megabyte) kullanabilirsiniz. Mesela sabah saatlerinde otomatik çalışan bir script ile indirme yapıyorsanız ve bu indirmenin diğer servisleri etkilememesini istiyorsanız bu parametre kritiktir.
Yeniden Deneme Sayısını Ayarlamak
Kararsız ağ bağlantılarında wget’in ne kadar ısrarcı olacağını belirleyebilirsiniz:
wget --tries=10 https://example.com/dosya.zip
–tries parametresi başarısız denemelerde kaç kez tekrar deneneceğini belirtir. Sonsuz deneme için 0 değerini kullanabilirsiniz ama bunu dikkatli kullanın, script’inizin sonsuza kadar takılıp kalmasına neden olabilir.
Timeout değerlerini de ayarlayabilirsiniz:
wget --timeout=30 --tries=5 https://example.com/dosya.zip
–timeout saniye cinsinden bağlantı, okuma ve DNS timeout değerini belirler.
Kimlik Doğrulama Gerektiren Dosyaları İndirmek
FTP ya da HTTP Basic Auth korumalı kaynaklardan dosya indirmek için:
wget --user=kullanici_adi --password=sifre ftp://ftp.example.com/dosya.tar.gz
Ya da daha güvenli yöntem olarak şifreyi komut satırına yazmadan interaktif girilmesini sağlamak için --ask-password kullanabilirsiniz:
wget --user=kullanici_adi --ask-password ftp://ftp.example.com/dosya.tar.gz
Şifreyi komut satırında düz metin olarak yazmak güvenlik açısından kötü bir pratiktir. bash_history dosyasında görünür ve ps aux çıktısında başkaları tarafından okunabilir. Mümkünse --ask-password ya da .netrc dosyasını tercih edin.
.netrc ile Güvenli Kimlik Doğrulama
Şifrelerinizi güvenli şekilde saklamak için ~/.netrc dosyasını kullanabilirsiniz:
# ~/.netrc dosyası içeriği
machine ftp.example.com
login kullanici_adi
password gizli_sifre
Dosya izinlerini mutlaka kısıtlayın:
chmod 600 ~/.netrc
Sonra wget’i normal şekilde çalıştırdığınızda bu bilgileri otomatik kullanır. Script’lerde şifre yönetimi için bu yöntem çok daha temizdir.
Çoklu Dosya İndirme
Birden fazla URL’yi aynı anda ya da sırayla indirmek isteyebilirsiniz. Bunun için URL listesini bir dosyaya yazıp wget’e verebilirsiniz:
# urls.txt içeriği:
# https://example.com/dosya1.zip
# https://example.com/dosya2.tar.gz
# https://mirror.example.org/dosya3.iso
wget -i urls.txt
-i parametresi girdi dosyasını belirtir. Büyük ölçekli dosya indirme operasyonlarında, örneğin bir güncelleme script’i yazarken bu yöntem çok işe yarar.
Recursive İndirme ve Web Site Mirroring
wgetin en güçlü özelliklerinden biri tüm bir web sitesini recursive olarak indirebilmesidir:
wget -r -np -k https://docs.example.com/
Burada kullanılan parametreler:
- -r: Recursive indirme yapar, bağlantıları takip eder
- -np (–no-parent): Üst dizinlere çıkmaz, sadece belirtilen yolda kalır
- -k (–convert-links): İndirilen HTML dosyalarındaki linkleri yerel dosyalara işaret edecek şekilde dönüştürür
Bir web sitesinin yerel kopyasını almak için daha kapsamlı komut:
wget --mirror --convert-links --adjust-extension --page-requisites --no-parent https://docs.example.com/
–mirror: -r -N -l inf --no-remove-listing seçeneklerinin kısaltmasıdır –adjust-extension: HTML dosyalarına .html uzantısı ekler –page-requisites: CSS, JS, resim gibi bağımlılıkları da indirir
Bu komutla bir dökümantasyon sitesinin offline kopyasını alabilirsiniz. Özellikle internete erişimi kısıtlı ortamlarda çalışan ekipler için bu yöntem çok değerlidir.
User-Agent Değiştirmek
Bazı sunucular wget user-agent’ını tanıyıp isteği reddedebilir. Bu durumda user-agent’ı değiştirebilirsiniz:
wget --user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0" https://example.com/dosya.zip
Ya da user-agent’ı tamamen boş bırakmak için:
wget -U "" https://example.com/dosya.zip
Header Eklemek
Özellikle API’lardan dosya indirirken custom header eklemeniz gerekebilir:
wget --header="Authorization: Bearer TOKEN_DEGERI"
--header="Accept: application/octet-stream"
https://api.example.com/export/report.csv
SSL Sertifika Sorunlarını Aşmak
Test ortamlarında ya da self-signed sertifika kullanan sunucularda SSL hatası alabilirsiniz:
wget --no-check-certificate https://internal.example.com/dosya.zip
Bu parametreyi sadece güvendiğiniz ortamlarda kullanın. Üretim ortamında ya da bilinmeyen kaynaklardan indirme yaparken kesinlikle kullanmayın. Sertifika doğrulama güvenliğin önemli bir parçasıdır.
Daha doğru yaklaşım sertifika sorununu kök nedeninden çözmektir. Eğer internal CA kullanıyorsanız CA sertifikasını sisteme ekleyin:
# Debian/Ubuntu
sudo cp internal-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
Pratik Senaryolar ve Script Örnekleri
Senaryo 1: Otomatik Yedekleme Script’i
Uzak sunucudaki yedek dosyalarını her gece otomatik çeken bir script:
#!/bin/bash
TARIH=$(date +%Y%m%d)
HEDEF_DIZIN="/backup/remote_backups"
LOG_DOSYASI="/var/log/backup_download.log"
wget -q
--tries=3
--timeout=60
-P "$HEDEF_DIZIN"
--user=backup_user
--password=$(cat /etc/backup_credentials)
"ftp://backup.example.com/db_backup_${TARIH}.sql.gz"
2>> "$LOG_DOSYASI"
if [ $? -eq 0 ]; then
echo "$(date): Yedek başarıyla indirildi" >> "$LOG_DOSYASI"
else
echo "$(date): HATA - Yedek indirilemedi!" >> "$LOG_DOSYASI"
# Bildirim gönder
fi
-q parametresi sessiz mod’dur, çıktı üretmez. Log dosyasına sadece sizin yazdıklarınız gider.
Senaryo 2: Paket İndirme ve Doğrulama
Bir yazılım paketini indirip checksumunu doğrulayan script:
#!/bin/bash
URL="https://releases.example.com/myapp-2.1.0.tar.gz"
CHECKSUM_URL="https://releases.example.com/myapp-2.1.0.tar.gz.sha256"
# Dosyayı indir
wget -q "$URL" -O myapp.tar.gz
# Checksum dosyasını indir
wget -q "$CHECKSUM_URL" -O myapp.tar.gz.sha256
# Doğrulama
if sha256sum -c myapp.tar.gz.sha256; then
echo "Doğrulama başarılı, kuruluma devam ediliyor..."
tar xzf myapp.tar.gz
else
echo "HATA: Checksum eşleşmiyor! Dosya bozuk olabilir."
rm -f myapp.tar.gz myapp.tar.gz.sha256
exit 1
fi
İndirdiğiniz dosyaları her zaman checksum ile doğrulayın. Bu hem bütünlük kontrolü hem de güvenlik açısından kritiktir.
Senaryo 3: Belirli Dosya Tiplerini Recursive İndirmek
Bir sitedeki sadece PDF dosyalarını indirmek:
wget -r -l2 -nd -A "*.pdf" https://docs.example.com/manuals/
- -l2: Maksimum 2 seviye derinliğe iner
- -nd (–no-directories): Dizin yapısı oluşturmaz, tüm dosyaları düz olarak indirir
- -A “*.pdf”: Sadece PDF uzantılı dosyaları kabul eder
Senaryo 4: Zaman Damgası Kontrolüyle İndirme
Sunucudaki dosya değiştiyse indir, değişmediyse atla:
wget -N https://updates.example.com/config.xml
-N (–timestamping) parametresi yerel dosyanın son değiştirilme tarihiyle uzak dosyanın tarihini karşılaştırır. Bu, otomatik güncelleme script’lerinde gereksiz bant genişliği kullanımını önler.
wget Çıkış Kodları
Script’lerde wget’in başarılı olup olmadığını kontrol etmek için çıkış kodlarını bilmek önemlidir:
- 0: Başarılı
- 1: Genel hata
- 2: Parse hatası
- 3: Dosya I/O hatası
- 4: Ağ hatası
- 5: SSL doğrulama hatası
- 6: Kimlik doğrulama hatası
- 7: Protokol hatası
- 8: Sunucu hata kodu döndürdü (404, 500 vb.)
Script’lerinizde $? ile son komutun çıkış kodunu alabilirsiniz. Özellikle kritik indirme operasyonlarında bu kontrolleri mutlaka yapın.
Log Tutmak
wget işlemlerini kayıt altına almak için:
wget -o /var/log/wget_islemleri.log https://example.com/dosya.zip
Hem terminale yazdırmak hem de dosyaya kaydetmek için:
wget -o indirme.log https://example.com/dosya.zip
tail -f indirme.log # Başka terminalde takip edin
Detaylı debug çıktısı için:
wget -d https://example.com/dosya.zip 2>&1 | tee debug.log
-d debug modunu aktif eder. HTTP headerları, redirect’ler, cookie bilgileri gibi detayları gösterir. Sorun giderme sırasında çok işe yarar.
Proxy Üzerinden İndirme
Proxy kullanan ortamlarda wget’i yapılandırmak için ortam değişkenlerini kullanabilirsiniz:
export http_proxy="http://proxy.example.com:3128"
export https_proxy="http://proxy.example.com:3128"
wget https://example.com/dosya.zip
Ya da doğrudan wget komutunda:
wget -e use_proxy=yes
-e http_proxy=http://proxy.example.com:3128
https://example.com/dosya.zip
Proxy’yi bypass etmek istediğiniz adresler için no_proxy ortam değişkenini kullanın:
export no_proxy="localhost,127.0.0.1,internal.example.com"
.wgetrc ile Kalıcı Konfigürasyon
Her seferinde aynı parametreleri yazmak yerine ~/.wgetrc dosyasında varsayılan değerleri belirleyebilirsiniz:
# ~/.wgetrc
tries = 3
timeout = 60
continue = on
limit-rate = 5m
user-agent = Mozilla/5.0 (compatible; wget)
Bu ayarlar sistem genelinde geçerli olmasını istiyorsanız /etc/wgetrc dosyasını düzenleyin. Tüm kullanıcıları etkiler, bu yüzden dikkatli olun.
Sık Karşılaşılan Sorunlar ve Çözümleri
403 Forbidden hatası: Sunucu wget user-agent’ını bloke ediyor olabilir. User-agent değiştirmeyi deneyin.
SSL handshake hatası: Sistem CA sertifikaları güncel olmayabilir. ca-certificates paketini güncelleyin.
Yavaş indirme: DNS çözümleme yavaş olabilir. --dns-timeout parametresini düşürün ya da farklı DNS sunucusu kullanın.
Dosya izinleri sorunu: wget’in yazmak istediği dizinde yazma izninin olduğundan emin olun. Özellikle cron job’larında kullanıcı izinlerine dikkat edin.
Redirect döngüsü: --max-redirect=5 parametresiyle redirect sayısını sınırlayabilirsiniz.
Sonuç
wget, sysadmin araç kutusunun vazgeçilmez bir parçasıdır. Basit tek dosya indirmelerinden karmaşık otomatik yedekleme sistemlerine kadar geniş bir kullanım alanı vardır. Temel parametreleri öğrendikten sonra gerçek gücü script’lerde ortaya çıkar.
En önemli alışkanlıklar şunlardır: İndirdiğiniz dosyaları her zaman checksum ile doğrulayın, şifreleri komut satırında düz metin olarak yazmaktan kaçının, script’lerinizde çıkış kodlarını kontrol edin ve üretim ortamında bant genişliği limitlemesini unutmayın.
wget --help ve man wget komutları her zaman yanınızdadır. Yüzlerce parametresi olan bir araçtır ama günlük olarak kullandığınız 10-15 parametre işlerinizin büyük çoğunluğunu karşılar. Zamanla özel senaryolarınız için doğru kombinasyonları bulmak kolaylaşır ve wget olmadan nasıl çalıştığınızı sormaya başlarsınız kendinize.