Polecenie curl: opcje, żądania POST i pobieranie plików
Polecenie curl to narzędzie, które z terminala wysyła żądanie pod adres internetowy i wypisuje odpowiedź bez zmian. Jednym wierszem sprawdzisz treść strony, nagłówki i kod stanu. Po wysłaniu żądań curl z serwera AlmaLinux 9 do witryny WordPress adres http odpowiedział kodem 301 wskazującym adres https, a żądanie do REST API bez uwierzytelnienia zostało odrzucone z kodem 401.
1️⃣ Podstawy polecenia curl i treść odpowiedzi
Jeśli po curl wpiszesz jeden adres, curl wyśle pod ten adres żądanie GET i wypisze na ekranie treść odpowiedzi. Po zażądaniu pliku robots.txt tworzonego przez WordPress zawartość trzywierszowego pliku przyszła bez zmian.
curl https://example.com/robots.txtUser-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.phpŁatwo oczekiwać tej samej strony, którą widzisz po wpisaniu adresu w przeglądarce, ale curl wypisuje surowy HTML wysłany przez serwer. curl nie uruchamia skryptów i nie pobiera osobno obrazów ani CSS. HTML strony jest długi, więc przy adresach stron internetowych przekazujemy wynik potokiem do head i sprawdzamy tylko kilka pierwszych wierszy.
curl -s https://example.com/ | head -n 2<!DOCTYPE html>
<html lang="ko-KR">Opcja -s ukrywa wskaźnik postępu, który przy przekazywaniu wyniku potokiem miesza się z tym, co widać na ekranie. HTML pobrany z samego adresu strony głównej miał 96 679 bajtów. Pliki obrazów i skryptów nie wliczają się do tego rozmiaru.
2️⃣ Sprawdzanie nagłówków przez curl -I i przekierowania z -L
Sama treść nie powie ci, czy żądanie się udało, dlatego kod stanu i nagłówki sprawdzasz osobno opcją -I. -I wysyła żądanie HEAD i wypisuje tylko nagłówki odpowiedzi, bez treści. To tak, jakby przeczytać etykietę przesyłki bez otwierania paczki.
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[HTTP/2 200] w pierwszym wierszu to kod stanu. Pod nim są typ serwera, typ treści i nagłówki związane z pamięcią podręczną. Jeśli wyślesz to samo żądanie na adres http, pojawi się 301, a w nagłówku [Location] adres https, pod który trzeba przejść.
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/Przy żądaniu adresu http bez opcji curl nie wysłał ponownego żądania pod adres z [Location]; wypisał tylko 7 wierszy treści odpowiedzi 301 i zakończył działanie.
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>Z opcją -L curl ponownie wysyła żądanie pod adres z [Location]. Gdy połączysz ją z -I i uruchomisz -IL, po nagłówkach odpowiedzi 301 pojawią się kolejno nagłówki odpowiedzi 200.
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=86400Na diagramie poniżej porównasz krok po kroku, ile żądań wychodzi i co pojawia się na ekranie przy każdej opcji.
3️⃣ Pobieranie plików poleceniem curl (-o, -O)
-O zapisuje plik w bieżącym folderze pod ostatnią nazwą pliku z adresu. Podczas zapisywania ekran zamiast treści pokazuje wskaźnik postępu.
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.pngPo pobraniu [Total] i [Received] we wskaźniku postępu wynosiły po 3113, a rozmiar pliku sprawdzony przez ls -l też się zgadzał: 3113 bajtów.
Aby samemu ustalić nazwę zapisywanego pliku, wpisz ją po -o. Poniżej wynik zapisania adresu strony głównej jako 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 --:--:-- --:--:-- --:--:-- 4291kls -l home.html-rw-r--r-- 1 root root 96679 Oct 28 14:29 home.html-O bierze nazwę pliku z końca adresu bez zmian, więc nie pasuje do adresów stron kończących się ukośnikiem. Po dodaniu -O do adresu strony głównej curl nie znajduje nazwy pliku i kończy działanie z błędem poniżej.
curl -O https://example.com/curl: Remote file name has no length!
curl: (23) Failed writing received data to disk/application4️⃣ Żądania POST w curl i wysyłanie danych JSON
Aby wysłać dane żądaniem, które dotąd tylko czytało, użyj -d, a do określenia formatu danych dodaj -H. -d wysyła dane wpisane po nim jako treść POST. Gdy nie podasz nic więcej, [Content-Type] to [application/x-www-form-urlencoded].
Z -d metoda żądania zmienia się na POST, więc [-X POST] możesz pominąć. Oficjalna dokumentacja też wyjaśnia, że -X zwykle nie jest potrzebne.
Przy wysyłaniu JSON zmień przez -H [Content-Type] na [application/json]. Poniżej wynik żądania utworzenia wpisu wysłanego do REST API WordPressa bez uwierzytelnienia.
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}}Witryna, do której trafiło żądanie blokuje żądania REST API od niezalogowanych użytkowników i dlatego code zwróciło [rest_authentication_error], a stan wyniósł 401. Przez to samo ustawienie także żądanie GET listy wpisów pod tym samym adresem zwróciło 401. Wartość message to komunikat o błędzie napisany w języku witryny i zamieniony na zapis Unicode w JSON.
Aby sprawdzić tylko kod stanu, odrzuć treść przez [-o /dev/null] i wypisz przez -w tylko 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/posts4015️⃣ Pomiar czasu odpowiedzi poleceniem curl (-w)
Gdy odpowiedź jest wolna, łatwo patrzeć tylko na total, ale żeby zobaczyć, czy czas poszedł na połączenie, czy na przetwarzanie na serwerze, trzeba wypisać osobno czas każdego etapu. -w po zakończeniu żądania wypisuje zmierzone wartości w podanym formacie. Wartości trafiają w miejsca [%{nazwa zmiennej}] w formacie.
Treść odrzuć przez [-o /dev/null], a wskaźnik postępu ukryj opcją -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.022825connect to połączenie TCP, tls to negocjacja TLS, ttfb to czas do chwili tuż przed wysłaniem pierwszego bajtu, a total to czas do końca przesyłania. Wszystkie cztery wartości to sekundy liczone narastająco od rozpoczęcia żądania.
Ponieważ serwer z curl i witryna przyjmująca żądanie były na tym samym serwerze, połączenie trwało tylko 0,0015 s, negocjacja TLS skończyła się po 0,0177 s, a pierwszy bajt dotarł po 0,0219 s. Od końca negocjacji TLS do nadejścia pierwszego bajtu minęło około 0,004 s. Oficjalna dokumentacja wyjaśnia, że ten etap obejmuje czas, w którym serwer przygotowuje wynik.
Po trzech kolejnych uruchomieniach tego samego polecenia total mieścił się między 0,0219 a 0,0226 s.
🔲 Symulator polecenia curl
W symulatorze poniżej wpiszesz samodzielnie dotychczasowe polecenia i sprawdzisz, jak zmienia się wynik przy każdej opcji.
🔢 FAQ & polecane treści








ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.