Bakış açımız şudur: Biz Geonode olarak proxy satışı yapıyoruz; bu nedenle, proxy aracılığıyla dosya indirirken dikkat edilmesi gereken en önemli nokta, maliyetin tamamen bant genişliğinden kaynaklandığı ve dosyaların büyük boyutlu olduğudur. 4 GB'lık bir indirmeyi, GB başına 0,79 $ olan kotalı ev trafiği üzerinden yönlendirmek, tek bir dosya için yaklaşık 3,16 $'a mal olur; buna karşılık, GB başına 0,14 $ olan veri merkezi trafiğinde bu maliyet 0,56 $'dır. İndirme işleminizin bir tüketici bağlantısından geliyormuş gibi görünmesi gerekmiyorsa — ki çoğu indirme işlemi için bu geçerlidir — ev tipi bant genişliği parayı boşa harcamak demektir. Fiyatlar, Eylül 2026 tarihinde kontrol edilen fiyatlandırma sayfamızdan alınmıştır. Daha da iyisi: Doğrudan indirebiliyorsanız, bunu yapın ve hiçbir ücret ödemeyin.
Bunu da belirtmişken, işte bunu doğru şekilde yapmanın yolu.
Çıktı Dosyasını Adlandırmanın Üç Yolu
Varsayılan olarak curl standart çıktıya yazar; bu yüzden basit bir curl https://example.com/file.zip
komutu terminalinizi ikili verilerle doldurur. Bunu değiştiren üç seçenek vardır.
**-o filename
** komutu, sizin seçtiğiniz bir adla dosya oluşturur:
curl -o archive.zip https://example.com/download?id=1234
Dosyanın adının ne olacağını bildiğinizde ve özellikle URL’de kullanışlı bir dosya adı bulunmadığında bunu kullanın.
**-O
** komutu, uzak adını kullanır. curl kılavuzu bunu şöyle açıklar: "Çıktıyı, uzak dosya adıyla adlandırılmış bir dosyaya yazar. Yalnızca uzak dosyanın dosya kısmı kullanılır, yol kısmı kesilir."
curl -O https://example.com/files/report.pdf
# saves as report.pdf
Bu cümledeki uyarıya dikkat edin. Yol atlandığından, farklı dizinlerde bulunan ve aynı temel ada sahip iki dosya birbirinin üzerine yazılır. Ayrıca, URL bir eğik çizgiyle bitiyorsa veya dosya adı bileşeni içermiyorsa, -O
komutu başarısız olur.
**-J
** ise adı sunucunun Content-Disposition
başlığından alır. Bu, -O
komutuna "URL'den bir dosya adı çıkarmak yerine sunucu tarafından belirtilen Content-Disposition dosya adını kullan" talimatını verdiği şeklinde belgelenmiştir. URL'nin opak bir tanımlayıcı olduğu indirme uç noktaları için kullanışlıdır.
Ayrıca kılavuzdaki en kesin uyarıyı da içerir ve bu uyarıyı burada aktarmakta fayda var:
UYARI: Content-Disposition dosya adı doğrulanmaz veya temizlenmez. Yol geçiş dizileri (..) içerebilir; çıktıyı güvenilir olmayan bir konuma kaydetmeyin veya bu seçenek etkin durumdayken önceden haber vermeden kaydetmeyin.
Başka bir deyişle, ``-OJ`
, uzak bir sunucunun dosya sisteminizde bir yol seçmesine izin verir. Kontrolünüz altındaki bir kaynak söz konusuysa sorun yoktur. Ancak rastgele URL’lerden veri çeken bir komut dosyasında bu, bir güvenlik açığıdır. Güvenilmeyen kaynaklardan sunucu tarafından sağlanan adlara ihtiyacınız varsa, başlıkları alın, adı kendiniz temizleyin ve ``-o
` kullanın.
Yönlendirmeler: Neden -L Neredeyse Her Zaman Gerekli?
curl, varsayılan olarak yönlendirmeleri takip etmez. -L adresinde, "HTTP yönlendirmelerini takip et ve istekleri başlangıçta belirtilen yöntemle tekrarla" şeklinde belirtilmiştir.
Bu, bir indirme işleminin istediğiniz içerik yerine HTML içeren küçük bir dosya üretmesinin en yaygın nedenidir. İndirme URL'leri sürekli olarak yönlendirilir — CDN'lere, imzalı URL'lere, yedek sunuculara, bölgesel uç noktalara. -L kullanmazsanız, yönlendirme sayfasını kaydedersiniz.
curl -L -O https://example.com/latest.tar.gz
İki ilgili nokta.
-o ile sıra önemlidir. Birden fazla URL içeren yönlendirmeleri takip ederken, curl -o argümanlarını URL'lerle konumsal olarak eşleştirir. Tek bir URL söz konusu olduğunda bu bir sorun oluşturmaz, ancak çoklu URL içeren komutlar yazan kullanıcılar için şaşırtıcı olabilir.
Yönlendirmelere bir sınır koyun. --max-redirs, curl'un takip edeceği yönlendirmelerin sayısını sınırlar. Varsayılan değer oldukça cömert olmakla birlikte, sınırsız bir limit karşısında oluşabilecek yönlendirme döngüsü, bir cron görevinde karşılaşmak isteyeceğiniz bir hata durumu değildir.
Sessiz Hata: Hata Sayfalarını Dosya Olarak Kaydetme
Bu, bu makaledeki en önemli noktadır.
Varsayılan olarak, curl bir HTTP hata yanıtını başarılı bir aktarım olarak değerlendirir. 404 kodlu bir yanıtın gövdesi vardır; curl bu gövdeyi indirir; curl 0 koduyla sonlanır. Artık "Not Found" yazan bir HTML sayfası içeren installer.dmg
adlı bir dosyanız var ve komut dosyanız her şey yolunda gitmiş gibi devam etti.
--fail
bu sorunu giderir. Kılavuzda şöyle yazıyor: "Yanıt gövdesi çıkışı olmayan, durum kodu 400 veya daha büyük olan HTTP yanıtları için 22 hata koduyla başarısızlık bildirilir."
curl --fail -L -O https://example.com/installer.dmg
Artık bir 404 hatası, 22 çıkış kodunu üretir ve dosya oluşturulmaz. Komut dosyanız bunu kontrol edebilir.
İki iyileştirme:
**--fail-with-body
** aynı işlevi görür ancak yanıt gövdesini korur; bu, API'lerin günlüğe kaydetmek istediğiniz yararlı JSON hata mesajları döndürdüğü durumlarda değerlidir.
**--fail
mükemmel değildir.** Bazı sunucuların yaptığı gibi, hata sayfası ile birlikte 200 kodunu döndüren sunucuları yakalayamaz. Önemli herhangi bir durum için sonucu doğrulayın — dosya boyutunun makul olup olmadığını kontrol edin, yayınlanmışsa sağlama toplamını kontrol edin veya sihirli baytları kontrol edin:
curl --fail -L -o pkg.tar.gz "$URL" || exit 1
file pkg.tar.gz | grep -q gzip || { echo "not a gzip archive"; exit 1; }
Bu nedenle, komut dosyaları için standart indirme satırı şöyledir:
curl --fail --silent --show-error --location -o output.bin "$URL"
-sS
, hata mesajlarını korurken ilerleme göstergesini gizler; bu da otomasyonda istediğiniz şeydir. Etkileşimli kullanım için -#
, varsayılan gösterge yerine basit bir ilerleme çubuğu sunar.
Kesintiye Uğrayan İndirmeleri Devam Ettirme
Büyük dosyalar ve güvenilir olmayan bağlantılar nedeniyle bu özellik hayati önem taşır.
-C - komutunun açıklaması şöyledir: "Belirtilen bayt ofsetinden önceki bir aktarımı devam ettirir. Aktarımı nereden ve nasıl devam ettireceğini curl’a otomatik olarak belirlemesi için '-C -' seçeneğini kullanın."
curl -C - -L -O https://example.com/large-file.iso
curl, yerel dosyanın boyutunu kontrol eder ve Range başlığını kullanarak yalnızca kalan kısmı ister. Yeniden deneme özelliğiyle birleştirildiğinde, bu uzun indirme işlemlerinin başarıyla tamamlanmasını sağlar:
curl --fail -L -C - --retry 5 --retry-delay 5 -O https://example.com/large-file.iso
Üç uyarı.
Sunucu aralık isteklerini desteklemelidir. Desteklemiyorsa, curl indirmeye devam edemez ve ya baştan başlatır ya da hata verir. Yanıt başlıklarında Accept-Ranges: bytes olup olmadığını kontrol edin.
Bozuk bir dosyayı devam ettirmek, daha uzun bir bozuk dosya elde etmenize neden olur. -C - yerel baytlara güvenir. Kısmi dosya yazma işlemi sırasında kesilmişse veya kaynak değişmişse, sonuç sessizce hatalı olur. Kaynak bir sağlama toplamı yayınlıyorsa, bunu kullanarak doğrulayın.
Değişen bir kaynak, devam ettirme işlemini geçersiz kılar. Denemeler arasında dosya değiştirilmişse, hata olmadan iki sürümün bir karışımı elde edersiniz.
Birçok Dosyayı Paralel Olarak İndirme
curl 7.66 sürümünden itibaren, -Z
komutu “sıralı yerine paralel aktarımlar” gerçekleştirir; --parallel-max
seçeneği ise “paralel olarak gerçekleştirilecek maksimum aktarım sayısını” belirler.
curl -Z --parallel-max 8 --fail -L \
-O https://example.com/a.zip \
-O https://example.com/b.zip \
-O https://example.com/c.zip
Bir URL dosyası kullanıldığında:
xargs -a urls.txt curl -Z --parallel-max 8 --fail -L --remote-name-all
--remote-name-all
komutu, her URL’ye -O
davranışını uygular; bu sayede bayrağı tekrar tekrar belirtme gereği ortadan kalkar.
Paralellik düzeyini dikkatli bir şekilde seçin. Belli bir noktadan sonra daha fazla olması daha iyi değildir: sunucular hız sınırlaması uygular, kendi bağlantınız doyar ve bu platoyu aştığınızda verim yerine hatalar üretirsiniz. İyi donanımlı bir sunucu için sekiz makul bir başlangıç rakamıdır; küçük bir sunucuya karşı ise dört veya daha azı daha nazik bir yaklaşımdır ve genellikle genel olarak daha hızlıdır. Buradaki davranış, eşzamanlılık ve paralellik başlıklı yazımızda açıkladığımız verim eğrisiyle aynıdır — yükselir, bir platoya ulaşır, sonra düşer.
Dizinler, Zaman Damgaları ve Hız Sınırları
Kullanıcıların sıklıkla yazdığı sarmalayıcı komut dosyalarını ortadan kaldıran üç seçenek.
**--output-dir
** — "Dosyaların kaydedileceği dizini belirtin. Bu seçenek, --remote-name veya --output seçenekleriyle birlikte çalışır." Artık öncesinde ve sonrasında cd
yazmaya gerek yok.
**--create-dirs
** — -o
seçeneğiyle birlikte, "curl gerekli yerel dizin hiyerarşisini oluşturur. Oluşturulan dizinler, Unix sistemlerinde 0750 modunu kullanır." Modun 0750 olduğunu, 0755 olmadığını unutmayın. Başka bir kullanıcı veya hizmetin bu dizinleri okuması gerekiyorsa, bu durum sizi şaşırtabilir.
curl --fail -L --create-dirs -o data/2026/09/report.pdf https://example.com/report.pdf
**--remote-time
** — "sistemin dosya değiştirme tarih ve saatini, uzak dosyanın zaman damgasıyla eşleşecek şekilde ayarlar". Sonraki araçların güncelliği değerlendirebilmesini sağladığı için, yedekleme için gerçekten kullanışlıdır.
**--limit-rate
** — "Aktarım hızını belirtilen orana sınırlar", k
, M
ve G
soneklerini kabul eder:
curl --limit-rate 2M -L -O https://example.com/large.iso
İnsanların sandığından daha fazla kullanmaya değer. Uplink'inizi aşırı yüklemek, ağdaki diğer her şeyi kullanılamaz hale getirir; paylaşımlı veya kotalı bir bağlantıda hız sınırlaması basit bir nezaket kuralıdır. Ayrıca, bir sunucunun sizi kötüye kullanım yapan bir kullanıcı olarak değerlendirmesi olasılığını da azaltır.
Pratik olanları bir araya getirelim:
curl --fail --location --continue-at - --retry 5 \
--remote-time --create-dirs \
--output downloads/archive.tar.gz \
"$URL"
Proxy Üzerinden İndirme
-x
adresini ekleyin; yukarıdaki tüm bilgiler geçerliliğini korur, ancak üç ekleme vardır.
curl -x http://user:pass@proxy.example.com:9000 \
--fail -L -O https://example.com/file.zip
Zaman aşımı ayarları yeniden gözden geçirilmelidir. --max-time
, boyutu öngörülemeyen indirmeler için yanlış bir araçtır; çünkü meşru bir büyük aktarım, sabit bir sınırı aşacaktır. Bunun yerine hıza dayalı durma algılayıcısını kullanın:
curl -x "$PROXY" --fail -L \
--connect-timeout 10 --speed-limit 1000 --speed-time 30 \
-O https://example.com/large.iso
Bu, aktarım hızı 30 saniye boyunca saniyede 1000 baytın altında kalırsa indirmeyi sonlandırır; ancak yavaş ilerleyen, birkaç saat süren indirmeleri kesintiye uğratmaz. Zaman aşımı seçeneklerinin tamamını curl ile zaman aşımı ayarlama başlıklı yazımızda ele aldık.
Devam ettirme davranışı, rotasyonla etkileşim halindedir. Proxy'niz bağlantı başına çıkış adreslerini değiştiriyorsa, devam ettirilen aktarım orijinalinden farklı bir adresten gelir. Bazı sunucular bunu kabul eder; bazıları farklı bir aynaya yönlendirir; bazıları ise aralık isteğini reddeder. Uzun indirmeler için, aynı çıkış adresini koruyan bir oturum kullanın.
Bant genişliği zihninizde her iki yönde de faturalandırılır, gerçekte ise sadece bir kez. Proxy'den geçen her bayt için ödeme yaparsınız. Bunu --retry
ile birleştirin ve büyük bir dosyanın %90'ında bir hata meydana gelirse, hesaplama hızla can sıkıcı bir hal alır. Proxy üzerinden yapılan indirmelerde her zaman -C -
kullanın; böylece yeniden deneme, baştan başlamak yerine devam eder.
Gerçekten Ne İndirdiğinizi Doğrulama
Sıfır çıkış kodu, aktarımın tamamlandığı anlamına gelir. Ancak bu, doğru baytları aldığınız anlamına gelmez; çalıştıracağınız, yükleyeceğiniz veya arşivleyeceğiniz her şey için bu boşluğu kapatmanız önemlidir.
Boyutun makul olup olmadığını kontrol edin. Bu, yapılabilecek en ucuz kontrol yöntemidir ve kesintileri, hata sayfalarını ve boş yanıtları yakalar:
SIZE=$(stat -c%s pkg.tar.gz 2>/dev/null || stat -f%z pkg.tar.gz)
[ "$SIZE" -gt 100000 ] || { echo "suspiciously small: $SIZE bytes"; exit 1; }
Dosya türünü kontrol edin. .tar.gz
uzantısıyla kaydedilmiş bir HTML hata sayfası, sayfa yeterince büyükse boyut kontrolünde görünmez, ancak file
ile kolayca tespit edilebilir:
file pkg.tar.gz | grep -q 'gzip compressed' || exit 1
Yayınlanmış bir sağlama toplamını kontrol edin. Kaynak bir kontrol toplamı yayınlıyorsa, bu, biçimi değil içeriği doğrulayan tek kontrol yöntemidir:
curl --fail -sL -O https://example.com/pkg.tar.gz
curl --fail -sL -O https://example.com/pkg.tar.gz.sha256
sha256sum -c pkg.tar.gz.sha256 || exit 1
Sık sık yanlış anlaşıldığı için bu sınırlamaya dikkat edin: aynı bağlantı üzerinden aynı sunucudan kontrol toplamını almak sizi bozulma ve kesilmeye karşı korur, ancak güvenliği ihlal edilmiş bir kaynağa karşı koruma sağlamaz. Sunucu hatalı bir dosya sunuyorsa, buna karşılık gelen hatalı bir sağlama toplamı da sunacaktır. GPG ile imza doğrulama bu sorunu çözer ve ayrıcalıklarla çalışacak her şey için bu ekstra adımı atmaya değer.
**Varsa, Content-Length
ile karşılaştırın.** Bir aktarım, bildirilen uzunluktan önce sona erdiğinde curl, 18 numaralı hata koduyla sıfırdan farklı bir değerle sonlanır; bu, bir tür kesilmeyi otomatik olarak yakalar — ancak yalnızca sunucu bir uzunluk bildirmişse; parçalı yanıtlarda bu durum söz konusu değildir.
Proxy üzerinden yapılan indirmelerde, doğrulamayı az değil, bolca yapın. Ekstra bir ara nokta, aktarımın kesintiye uğrayabileceği veya filtreleme yapan bir ara sunucu söz konusu olduğunda değiştirilebileceği ek bir yerdir. Yukarıdaki kontroller milisaniye sürer ve kafa karıştırıcı hata raporlarının bütün bir kategorisini ortadan kaldırır.
curl'ün Uygun Olmadığı Durumlar
curl, bir URL'yi almak konusunda mükemmeldir. Ancak buna bağlı birçok iş için daha uygun araçlar mevcuttur.
Yinelemeli indirmeler ve yansıtma. curl, belirttiğiniz URL'leri alır. Tarama yapmaz. Bir dizini veya siteyi yansıtmak için wget -r veya özel bir yansıtma aracı doğru seçimdir — bu karşılaştırmayı curl vs wget başlıklı yazımızda ele almıştık.
Güvenilmez bağlantılar üzerinden çok büyük dosyalar. Amaca yönelik olarak geliştirilmiş indirme yöneticileri, bölümlere ayrılmış aktarımları ve agresif devam ettirmeyi curl'dan daha iyi yönetir. -C - ve yeniden deneme özellikleriyle birlikte kullanılan curl yeterlidir; ancak özel araçlar daha iyidir.
Torrentler, rsync, S3 ve benzerleri. Bütünlük, tekilleştirme ve izinleri yerel olarak işleyen, kendi istemcileri olan farklı protokoller. aws s3 cp, sadece ek adımlar içeren bir curl değildir.
Bir paket yöneticisi mevcut olduğunda. Yazılım yüklemesi için curl | sh kullanmak rahattır, ancak bu, uzak sunucuya makinenizde doğrulama yapılmaksızın keyfi yürütme izni verir. Varsa paket yöneticisini kullanın.
Aynı kaynağın tekrar tekrar indirilmesi. Değişiklikleri kontrol etmek için bir dosyayı belirli aralıklarla alıyorsanız, -z veya If-None-Match ile koşullu istekler, değişmemiş içeriğin yeniden indirilmesini önler. Önbellek, hızlı indirmeden daha iyidir.
Sık Sorulan Sorular
curl ile bir dosyayı nasıl indirebilirim?
curl -O https://example.com/file.zip komutu dosyayı uzak adla kaydeder; -o name komutu ise ad seçmenize olanak tanır. Uygulamada --fail ve -L seçeneklerini de ekleyin: bunlar olmadan curl, yönlendirmeleri takip etmez ve hata sayfalarını, sanki istediğiniz dosya gibi kaydedecektir.
curl neden boş bir dosya veya HTML dosyası indiriyor?
Neredeyse her zaman takip etmediğiniz bir yönlendirme — -L ekleyin — ya da bir dosya olarak kaydedilmiş bir HTTP hatasıdır; --fail bunu önler. file downloaded.zip komutuyla veya bir metin düzenleyicide açarak ne aldığınızı kontrol edin; bir HTML hata sayfası hemen fark edilir.
Curl ile kesintiye uğramış bir indirmeyi nasıl devam ettirebilirim?
curl -C - -O <url>. Curl, yerel dosya boyutunu kontrol eder ve kalan kısmı aralık isteği yoluyla ister. Sunucunun aralıkları desteklemesi gerekir — Accept-Ranges: bytes adresine bakın — ve bozuk bir kısmi dosyayı devam ettirmenin, herhangi bir uyarı olmaksızın daha uzun bir bozuk dosya oluşturacağını unutmayın.
curl ile birden fazla dosyayı nasıl indiririm?
Paralel aktarımlar için -Z komutunu kullanın; eşzamanlılığı sınırlamak için --parallel-max komutunu ve her URL'nin remote-name davranışını sergilemesi için --remote-name-all komutunu kullanın. Bir dosyadaki liste için, xargs komutuyla borulayın. Paralelliği makul düzeyde tutun — sunucular hız sınırlamasına başladıkça aktarım hızı sabit bir seviyeye ulaşır ve ardından düşer.
curl'da indirme hızını nasıl sınırlayabilirim?
--limit-rate 2M seçeneği, aktarım hızını saniyede 2 megabayt ile sınırlar; bu seçenek k, M ve G soneklerini kabul eder. Hem ağınızın geri kalanını kullanılabilir tutmak hem de kötüye kullanım olarak değerlendirilmekten kaçınmak için, paylaşımlı bağlantılarda ve küçük sunuculara karşı kullanılması tavsiye edilir.
curl'da -O ve -o arasındaki fark nedir?
-O, URL'deki dosya adını kullanır ve yolu göz ardı eder. -o ise sizin belirlediğiniz bir ada yazar. URL'de kullanılabilir bir dosya adı olmadığında, belirli bir ada ihtiyacınız olduğunda veya farklı yollardan gelen aynı adlı dosyalar arasında çakışmayı önlemek istediğinizde -o seçeneğini kullanın.
curl -OJ güvenli midir?
Güvenilmeyen kaynaklarda değildir. Kılavuzda, Content-Disposition dosya adının "doğrulanmadığı veya temizlenmediği" ve "yol geçiş dizileri içerebileceği" konusunda açıkça uyarı yapılmaktadır. Bu, dosyanın nereye kaydedileceğinin uzak sunucu tarafından belirlendiği anlamına gelir. Başlığı alın, adı kendiniz temizleyin ve -o kullanın.
Bir curl indirmesinin başarılı olup olmadığını nasıl kontrol edebilirim?
--fail komutunu kullanarak HTTP hatalarının kaydedilmiş bir hata sayfası yerine 22 çıkış kodunu üretmesini sağlayın, ardından çıkış kodunu kontrol edin. Önemli herhangi bir şey için daha ayrıntılı doğrulama yapın: dosya boyutunun makul olup olmadığını kontrol edin, file komutunu çalıştırarak türü doğrulayın ve kaynak tarafından yayınlanmışsa bir sağlama toplamını karşılaştırın.
Sonuç
Çoğu örnekte gördüğünüz basit curl -O komutu, bir sorun çıkana kadar sorunsuz çalışır; ancak hata durumu en kötü türdendir — sıfır çıkış kodu ve istediğinizden farklı bir içerik barındıran bir dosya.
İki bayrak bu sorunu çözer. -L, hemen hemen her gerçek indirme URL’sinin kullandığı yönlendirmeleri takip eder; --fail ise curl’ün HTTP hata yanıtlarını sanki içerikmiş gibi kaydetmesini engeller. Büyük boyutlu dosyalar için -C - ekleyin; çünkü devam ettirilebilir indirme, geçici bir ağ sorunu ile baştan başlamak arasındaki farkı belirler.
Komut dosyaları için curl --fail --silent --show-error --location satırını ezberlemenizde fayda var; dosyalar büyükse --continue-at - ve --retry seçeneklerini de kullanın. Hangi seçenekleri kullanırsanız kullanın, yalnızca çıkış koduna güvenmek yerine sonucu doğrulayın — boyutu kontrol edin, türü kontrol edin, varsa sağlama toplamını kontrol edin. İndirmeler, hatayı açıkça bildirerek başarısız olmaktan çok, sessizce başarısız olur.