curl komutu: seçeneklerin kullanımı, POST istekleri ve dosya indirme

Test ortamıRHEL ailesiAlmaLinux 9.8root hesabı2026-10-28 tarihinde kontrol edildi

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.txt
User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php

Adresi 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=86400

Seç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.

🧭 curl seçeneklerine göre istek ve çıktı: http adresinin 301 yanıtı
Açıklama diyagramı
⚙️ Seçenek
$ curl -I -L -IL http://example.com/
① GETHEAD İstekhttp://example.com/
➜
301 Moved PermanentlyLocation: https://example.com/
② GETHEAD İstekhttps://example.com/İstek yok
➜
200Yanıt yok
🖥️ Ekrana yazdırılan
301 yanıt gövdesi (7 satır HTML)
301 yanıt başlıkları, 7 satır
200 yanıt gövdesi (ana sayfa HTML'i, 96.679 bayt)
301 başlıkları, 7 satır → 200 başlıkları, 10 satır
Seçeneksiz istekte curl, [Location] içindeki https adresine yeniden istek göndermez ve yalnızca 301 yanıtının gövdesini yazdırır.
-I, HEAD isteğiyle yalnızca başlıkları alır ve yeni adrese istek göndermeden 301 durumunu ve [Location] başlığını yazdırır.
-L, [Location] içindeki https adresine bir istek daha gönderir ve son 200 yanıtının gövdesini yazdırır.
-IL, iki yanıtın başlıklarını sırayla yazdırır. 301'in ardından 200 gelir.

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 --:--:-- --:--:-- --:--:--  190k
ls -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 --:--:-- --:--:-- --:--:-- 4291k
ls -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/application

4️⃣ 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/posts
401

5️⃣ 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.022825

connect 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.

curl komutu simülatörücurl 7.76.1
[root@server work]#
Klavyedeki ↑↓ tuşlarıyla daha önce yazdığınız komutları geri çağırabilirsiniz.

🔢 SSS & önerilen içerikler

-s hem ilerleme göstergesini hem de hata mesajlarını gizler. Var olmayan bir adrese istek gönderdiğimizde hiçbir şey yazdırılmadı, yalnızca çıkış kodu 6 kaldı. -sS ile birlikte belirtirseniz ilerleme göstergesi gizli kalır, ancak [curl: (6) Could not resolve host] gibi hatalar yine görünür.

-k, bağlantının güvenli olup olmadığını kontrol eden adımı atladığı için curl, bağlandığı sunucunun gerçekten o alan adına ait olup olmadığını kontrol etmeden veri gönderir. curl, sunucu sertifikasında bağlandığınız alan adının bulunup bulunmadığını ve sertifikanın sertifika deposuyla doğrulanıp doğrulanamadığını kontrol eder. Bu hata çıkarsa önce sertifikanın alan adını ve veren kuruluşu kontrol edin.

Resmî belgelere göre curl, 301, 302 veya 303 yanıtı aldığında sonraki isteği GET'e çevirerek gönderir. POST'u korumak için [--post301] gibi özel seçenekler kullanırsınız. -X ile belirtilen yöntem bu dönüşümden önce gelir.

🧭 Ağ komutları için önerilen içerikler 9 yazı · 2 kaynak
🗂️ Ağ komutları
📄 SSH komutu 📄 rsync komutu 📄 wget komutu 📄 rz · sz komutları 📄 curl komutu
📄 host komutu 📄 nslookup komutu
📄 ip komutu 📄 netstat · ifconfig komutları

ℹ️ 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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

İnsan olduğunuzu kanıtlayın: 2   +   6   =