curl-commando: opties, POST-verzoeken en bestanden downloaden

TestomgevingRHEL-familieAlmaLinux 9.8root-accountGecontroleerd op 2026-10-28

Het curl-commando is een hulpmiddel dat vanuit de terminal een verzoek naar een webadres stuurt en het antwoord ongewijzigd toont. Met één regel controleer je de inhoud van een pagina, de headers en de statuscode. Toen we vanaf een AlmaLinux 9-server curl-verzoeken naar een WordPress-site stuurden, verwees het http-adres met een 301-antwoord naar het https-adres, en een REST API-verzoek zonder authenticatie werd met 401 geweigerd.

1️⃣ Basisgebruik van het curl-commando en de inhoud van het antwoord

Zet je één adres achter curl, dan stuurt curl een GET-verzoek naar dat adres en toont het de inhoud van het antwoord op het scherm. Toen we de robots.txt opvroegen die WordPress aanmaakt, kwam de inhoud van het bestand van drie regels ongewijzigd terug.

curl https://example.com/robots.txt
User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php

Je verwacht al snel dezelfde pagina als wanneer je het adres in de browser intypt, maar curl toont de ruwe HTML die de server heeft gestuurd. curl voert geen scripts uit en vraagt afbeeldingen en CSS niet apart op. Pagina-HTML is lang, dus bij het adres van een webpagina sturen we de uitvoer via een pipe naar head en bekijken we alleen de eerste regels.

curl -s https://example.com/ | head -n 2
<!DOCTYPE html>
<html lang="ko-KR">

Met -s verberg je de voortgangsweergave die anders door de uitvoer loopt als je die via een pipe doorgeeft. De HTML die alleen van het adres van de startpagina kwam, was 96.679 bytes. Afbeeldingen en scriptbestanden zitten niet in die grootte.

2️⃣ Headers bekijken met curl -I en omleidingen volgen met -L

Aan de inhoud alleen zie je niet of het verzoek gelukt is, dus controleer je de statuscode en headers apart met -I. -I stuurt een HEAD-verzoek en toont alleen de headers van het antwoord, zonder inhoud. Het is alsof je alleen het verzendlabel leest zonder het pakket open te maken.

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

De [HTTP/2 200] op de eerste regel is de statuscode. Daaronder volgen het servertype, het inhoudstype en headers voor de cache. Stuur je hetzelfde verzoek naar het http-adres, dan krijg je 301 met in de header [Location] het https-adres waarnaar je moet gaan.

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/

Toen we het http-adres zonder opties opvroegen, vroeg curl het adres uit [Location] niet opnieuw op; het toonde alleen de 7 regels inhoud van het 301-antwoord en stopte.

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>

Met -L vraagt curl het adres uit [Location] opnieuw op. Combineer je het met -I tot -IL, dan volgen op de headers van het 301-antwoord de headers van het 200-antwoord.

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

In het diagram hieronder vergelijk je stap voor stap hoeveel verzoeken er per optie uitgaan en wat er op het scherm verschijnt.

🧭 Verzoeken en uitvoer per curl-optie: de 301 van het http-adres
Uitlegdiagram
⚙️ Optie
$ curl -I -L -IL http://example.com/
① GETHEAD Verzoekhttp://example.com/
➜
301 Moved PermanentlyLocation: https://example.com/
② GETHEAD Verzoekhttps://example.com/Geen verzoek
➜
200Geen antwoord
🖥️ Wat op het scherm verschijnt
Inhoud van het 301-antwoord (7 regels HTML)
Headers van het 301-antwoord, 7 regels
Inhoud van het 200-antwoord (HTML van de startpagina, 96.679 bytes)
301-headers, 7 regels → 200-headers, 10 regels
Zonder opties vraagt curl het https-adres uit [Location] niet opnieuw op en toont het alleen de inhoud van het 301-antwoord.
-I haalt met een HEAD-verzoek alleen de headers op en toont, zonder het nieuwe adres op te vragen, de status 301 en de header [Location].
-L stuurt nog een verzoek naar het https-adres uit [Location] en toont de inhoud van het laatste 200-antwoord.
-IL toont de headers van beide antwoorden op volgorde. Na de 301 volgt de 200.

3️⃣ Bestanden downloaden met het curl-commando (-o, -O)

-O slaat het bestand op in de huidige map onder de laatste bestandsnaam uit het adres. Tijdens het opslaan toont het scherm een voortgangsweergave in plaats van de inhoud.

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

Na het downloaden stonden [Total] en [Received] in de voortgangsweergave allebei op 3113, en de bestandsgrootte die we met ls -l controleerden, kwam ook overeen: 3.113 bytes.

Wil je de bestandsnaam zelf kiezen, zet die dan achter -o. Hieronder zie je het resultaat van het opslaan van het adres van de startpagina als home.html.

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 neemt de bestandsnaam aan het eind van het adres ongewijzigd over en past dus niet bij pagina-adressen die op een schuine streep eindigen. Zet je -O bij het adres van de startpagina, dan vindt curl geen bestandsnaam en stopt het met de foutmelding hieronder.

curl -O https://example.com/
curl: Remote file name has no length!
curl: (23) Failed writing received data to disk/application

4️⃣ POST-verzoeken met curl en JSON-gegevens versturen

Wil je met een verzoek dat tot nu toe alleen las ook gegevens meesturen, gebruik dan -d, en voeg -H toe om het gegevensformaat aan te geven. -d stuurt de gegevens die je erachter schrijft als POST-inhoud. Zonder verdere opgave is de [Content-Type] [application/x-www-form-urlencoded].

Met -d wordt de verzoekmethode POST, dus je kunt [-X POST] weglaten. Ook de officiële documentatie legt uit dat -X meestal niet nodig is.

Stuur je JSON, verander dan met -H de [Content-Type] in [application/json]. Hieronder zie je het resultaat van een verzoek om een bericht aan te maken, zonder authenticatie naar de WordPress REST API gestuurd.

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}}

De site waar we het verzoek naartoe stuurden blokkeert REST API-verzoeken van gebruikers die niet zijn ingelogd en daarom gaf code [rest_authentication_error] terug, met status 401. Door dezelfde instelling gaf ook een GET-verzoek voor de berichtenlijst op hetzelfde adres 401 terug. De waarde van message is een foutmelding in de taal van de site, omgezet naar de Unicode-notatie van JSON.

Wil je alleen de statuscode zien, gooi de inhoud dan weg met [-o /dev/null] en toon met -w alleen http_code.

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️⃣ Responstijd meten met het curl-commando (-w)

Bij een traag antwoord kijk je al snel alleen naar total, maar of de tijd in de verbinding of in de verwerking op de server zat, zie je pas als je de tijd per stap apart toont. -w toont na afloop van het verzoek de meetwaarden in het opgegeven formaat. De waarden komen op de plaatsen [%{variabelenaam}] in het formaat.

Gooi de inhoud weg met [-o /dev/null] en verberg de voortgangsweergave met -s.

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 is de TCP-verbinding, tls de TLS-onderhandeling, ttfb de tijd tot vlak voordat de eerste byte wordt verzonden en total de tijd tot de overdracht klaar is. Alle vier de waarden zijn seconden, opgeteld vanaf het begin van het verzoek.

Omdat de server waarop curl draaide en de site die het verzoek ontving op dezelfde server stonden, duurde de verbinding maar 0,0015 seconde, was de TLS-onderhandeling klaar na 0,0177 seconde en kwam de eerste byte na 0,0219 seconde. Van het einde van de TLS-onderhandeling tot de aankomst van de eerste byte duurde het ongeveer 0,004 seconde. Volgens de officiële documentatie zit in deze stap de tijd die de server nodig heeft om het resultaat te maken.

Toen we hetzelfde commando nog drie keer uitvoerden, lag total tussen 0,0219 en 0,0226 seconde.

🔲 Simulator voor het curl-commando

In de simulator hieronder typ je de commando's van tot nu toe zelf in en zie je hoe de uitvoer per optie verandert.

Simulator voor het curl-commandocurl 7.76.1
[root@server work]#
Met de toetsen ↑↓ haal je eerder ingetypte commando's terug.

🔢 FAQ & aanbevolen content

-s verbergt zowel de voortgangsweergave als foutmeldingen. Toen we een adres opvroegen dat niet bestaat, werd er niets getoond en bleef alleen afsluitcode 6 over. Geef je -sS samen op, dan blijft de voortgangsweergave verborgen, maar fouten zoals [curl: (6) Could not resolve host] worden nog steeds getoond.

-k slaat de stap over die controleert of de verbinding veilig is, dus curl verstuurt gegevens zonder te controleren of de bereikte server echt bij dat domein hoort. curl controleert of het servercertificaat de domeinnaam bevat waarmee je verbinding maakte en of het via de certificaatopslag te verifiëren is. Krijg je deze fout, controleer dan eerst de domeinnaam en de uitgever van het certificaat.

Volgens de officiële documentatie zet curl het volgende verzoek om naar GET als er een 301-, 302- of 303-antwoord komt. Wil je POST behouden, gebruik dan speciale opties zoals [--post301]. Een methode die je met -X opgeeft, gaat voor deze omzetting.

🧭 Aanbevolen content over netwerkcommando's 9 berichten · 2 bronnen
🗂️ Netwerkcommando's
📄 SSH-commando 📄 rsync-commando 📄 wget-commando 📄 rz- en sz-commando's 📄 curl-commando
📄 host-commando 📄 nslookup-commando
📄 ip-commando 📄 netstat- en ifconfig-commando's

ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Laat zien dat je geen machine bent: 3   +   10   =