curl komutu: seçeneklerin kullanımı, POST istekleri ve dosya indirme
curl komutu, terminalden bir web adresine istek gönderen ve yanıtı olduğu gibi yazdıran bir araçtır. Tek satırlık bir komutla sayfanın gövdesini, başlıklarını ve durum kodunu kontrol edebilirsiniz. Bir AlmaLinux 9 sunucusundan bir WordPress sitesine curl istekleri gönderdiğimizde, http adresi 301 yanıtıyla https adresini gösterdi ve kimlik doğrulaması olmayan REST API isteği 401 ile reddedildi.
1️⃣ curl komutunun temel kullanımı ve yanıt gövdesi
curl'ün arkasına bir adres eklerseniz o adrese GET isteği gönderir ve yanıt gövdesini ekrana yazdırır. WordPress'in oluşturduğu robots.txt dosyasını istediğimizde üç satırlık dosya içeriği olduğu gibi geldi.
curl https://example.com/robots.txtUser-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.phpAdresi tarayıcıya yazdığınızda gördüğünüz sayfanın aynısını beklemek kolaydır, ancak curl'ün yazdırdığı şey sunucunun gönderdiği ham HTML'dir. curl betikleri çalıştırmaz, görselleri ve CSS'i ayrıca istemez. Sayfa HTML'i uzun olduğu için web sayfası adreslerinde çıktıyı boru ile head'e aktarıp yalnızca ilk birkaç satırı kontrol ediyoruz.
curl -s https://example.com/ | head -n 2<!DOCTYPE html>
<html lang="ko-KR">-s eklerseniz çıktıyı boru ile aktarırken ekrana karışan ilerleme göstergesi gizlenir. Yalnızca ana sayfa adresinden alınan HTML 96.679 bayttı. Görsel ve betik dosyaları bu boyuta dahil değildir.
2️⃣ curl -I ile başlıkları kontrol etme ve -L ile yönlendirmeleri izleme
Yalnızca gövdeye bakarak isteğin başarılı olup olmadığını anlayamazsınız; bu yüzden durum kodunu ve başlıkları -I ile ayrıca kontrol edersiniz. -I bir HEAD isteği gönderir ve gövde olmadan yalnızca yanıt başlıklarını yazdırır. Bu, kargo kutusunu açmadan yalnızca gönderi etiketine bakmaya benzer.
curl -I https://example.com/HTTP/2 200
server: nginx/1.28.0
date: Wed, 28 Oct 2026 05:29:23 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
last-modified: Tue, 27 Oct 2026 21:12:18 GMT
cache-control: max-age=0
expires: Wed, 28 Oct 2026 05:29:23 GMT
accept-ranges: none
alt-svc: h3=":443"; ma=86400İlk satırdaki [HTTP/2 200] durum kodudur. Altında sunucu türü, içerik türü ve önbellekle ilgili başlıklar gelir. Aynı isteği http adresine gönderirseniz 301 ile birlikte [Location] başlığında gidilecek https adresi görünür.
curl -I http://example.com/HTTP/1.1 301 Moved Permanently
Server: nginx/1.28.0
Date: Wed, 28 Oct 2026 05:27:51 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://example.com/http adresini seçeneksiz istediğimizde curl, [Location] içindeki adrese yeniden istek göndermedi; 301 yanıtının yalnızca 7 satırlık gövdesini yazdırıp sonlandı.
curl http://example.com/<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.28.0</center>
</body>
</html>-L eklerseniz curl, [Location] içindeki adrese yeniden istek gönderir. -I ile birleştirip -IL olarak çalıştırırsanız 301 yanıt başlıklarının ardından sırayla 200 yanıt başlıkları gelir.
curl -IL http://example.com/HTTP/1.1 301 Moved Permanently
Server: nginx/1.28.0
Date: Wed, 28 Oct 2026 05:29:23 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://example.com/
HTTP/2 200
server: nginx/1.28.0
date: Wed, 28 Oct 2026 05:29:23 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
last-modified: Tue, 27 Oct 2026 21:12:18 GMT
cache-control: max-age=0
expires: Wed, 28 Oct 2026 05:29:23 GMT
accept-ranges: none
alt-svc: h3=":443"; ma=86400Seçeneğe göre kaç istek gittiğini ve ekranda ne göründüğünü aşağıdaki diyagramda adım adım karşılaştırabilirsiniz.
3️⃣ curl komutuyla dosya indirme (-o, -O)
-O, dosyayı adresteki son dosya adıyla geçerli klasöre kaydeder. Kaydederken ekranda gövde yerine ilerleme göstergesi görünür.
curl -O https://example.com/wp-includes/images/w-logo-blue.png % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 3113 100 3113 0 0 178k 0 --:--:-- --:--:-- --:--:-- 190kls -l w-logo-blue.png-rw-r--r-- 1 root root 3113 Oct 28 14:29 w-logo-blue.pngİndirme sonunda ilerleme göstergesindeki [Total] ve [Received] değerleri 3113 ile aynıydı; ls -l ile kontrol ettiğimiz dosya boyutu da 3.113 bayt olarak eşleşti.
Kaydedilecek adı kendiniz belirlemek için -o'nun arkasına dosya adını yazarsınız. Aşağıda ana sayfa adresini home.html olarak kaydetmenin sonucu var.
curl -o home.html https://example.com/ % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 96679 0 96679 0 0 4291k 0 --:--:-- --:--:-- --:--:-- 4291kls -l home.html-rw-r--r-- 1 root root 96679 Oct 28 14:29 home.html-O, adresin sonundaki dosya adını olduğu gibi kullandığı için eğik çizgiyle biten sayfa adreslerine uygun değildir. Ana sayfa adresine -O eklerseniz dosya adı bulunamaz ve curl aşağıdaki hatayla sonlanır.
curl -O https://example.com/curl: Remote file name has no length!
curl: (23) Failed writing received data to disk/application4️⃣ curl ile POST istekleri ve JSON verisi gönderme
Şimdiye kadar yalnızca okuyan bir istekle veri göndermek için -d kullanırsınız; veri biçimini belirtmek için de -H eklersiniz. -d, arkasına yazdığınız veriyi POST gövdesi olarak gönderir. Ayrıca belirtilmediğinde [Content-Type] değeri [application/x-www-form-urlencoded] olur.
-d kullanıldığında istek yöntemi POST'a döner, bu yüzden [-X POST] yazmayabilirsiniz. Resmî belgeler de -X'in genellikle gerekmediğini açıklar.
JSON gönderirken -H ile [Content-Type] değerini [application/json] yaparsınız. Aşağıda WordPress REST API'ye kimlik doğrulaması olmadan yazı oluşturma isteği göndermenin sonucu var.
curl -s -X POST -H 'Content-Type: application/json' -d '{"title":"curl test"}' https://example.com/wp-json/wp/v2/posts{"code":"rest_authentication_error","message":"\uc8c4\uc1a1\ud569\ub2c8\ub2e4. REST API \uc694\uccad\uc744 \ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.","data":{"status":401}}İstek gönderdiğimiz site oturum açmamış kullanıcıların REST API isteklerini engellediği için code alanında [rest_authentication_error] döndü ve durum 401 oldu. Aynı ayar nedeniyle aynı adrese GET ile yazı listesi istendiğinde de 401 döndü. message değeri, sitenin dilinde yazılmış hata cümlesinin JSON Unicode gösterimine dönüşmüş hâlidir.
Yalnızca durum kodunu görmek için gövdeyi [-o /dev/null] ile atar, -w ile yalnızca http_code değerini yazdırırsınız.
curl -s -o /dev/null -w '%{http_code}\n' -X POST -H 'Content-Type: application/json' -d '{"title":"curl test"}' https://example.com/wp-json/wp/v2/posts4015️⃣ curl komutuyla yanıt süresini ölçme (-w)
Yanıt yavaş olduğunda yalnızca total değerine bakmak kolaydır, ancak sürenin bağlantıda mı yoksa sunucu işleminde mi geçtiğini görmek için her aşamanın süresini ayrı ayrı yazdırmanız gerekir. -w, istek bittikten sonra ölçülen değerleri belirttiğiniz biçimde yazdırır. Değerler biçimdeki [%{değişken adı}] yerlerine yerleşir.
Gövdeyi [-o /dev/null] ile atar, ilerleme göstergesini -s ile gizlersiniz.
curl -o /dev/null -s -w 'code: %{http_code}\nconnect: %{time_connect}\ntls: %{time_appconnect}\nttfb: %{time_starttransfer}\ntotal: %{time_total}\n' https://example.com/code: 200
connect: 0.001507
tls: 0.017728
ttfb: 0.021912
total: 0.022825connect TCP bağlantısı, tls TLS anlaşmasıdır; ttfb ise ilk baytın gönderilmesinden hemen öncesine kadar, total de aktarım bitene kadar geçen süredir. Dört değerin hepsi isteğin başladığı andan itibaren biriken saniyelerdir.
curl'ü çalıştıran sunucu ile isteği alan site aynı sunucuda olduğu için bağlantı yalnızca 0,0015 saniye sürdü; TLS anlaşması 0,0177 saniyede tamamlandı ve ilk bayt 0,0219 saniyede geldi. TLS anlaşmasının bitişinden ilk baytın gelişine kadar yaklaşık 0,004 saniye geçti. Resmî belgeler bu aşamaya sunucunun sonucu üretme süresinin dahil olduğunu açıklar.
Aynı komutu üç kez daha çalıştırdığımızda total 0,0219 ile 0,0226 saniye arasında kaldı.
🔲 curl komutu simülatörü
Aşağıdaki simülatörde şimdiye kadarki komutları kendiniz yazarak çıktının seçeneğe göre nasıl değiştiğini görebilirsiniz.
🔢 SSS & önerilen içerikler








ℹ️ Satış ortaklığı bildirimi
Bu sitenin içeriklerinde satış ortaklığı bağlantıları bulunur. Bir ziyaretçi bu bağlantılar üzerinden ürün veya hizmet satın alırsa bu site satıcıdan komisyon alır. Bu süreçte alıcının ödediği tutar (kampanya indirimlerinde tutar düşer↓) artmaz. Yayımlanan fiyat, indirim ve stok bilgileri yazının yazıldığı zamana aittir ve gerçek durumdan farklı olabilir; bu yüzden satın almadan önce son bilgiyi satıcıdan kontrol etmenizi rica ederiz. Ürünler kendi ölçütlerimize göre seçilir ve değerlendirilir; komisyon alınıp alınmaması tanıtım sırasını veya değerlendirme içeriğini etkilemez.