Кодови грешака curl: Комплетан референтни водич

Када curl команда не успе, враћа нумерички излазни код (познат и као curl код грешке) који идентификује тип грешке. Можете проверити curl излазни код покретањем echo $? одмах након curl команде (или $LASTEXITCODE у PowerShell-у). Излазни код 0 значи успех; било који други број указује на специфичан проблем — од неуспеха DNS резолуције и тајмаута повезивања до проблема са SSL сертификатима. Ова страница је комплетан референтни водич најчешћих curl кодова грешака са објашњењима, узроцима и решењима. Ако радите са curl командама у свом коду, налепите их у curl2code за конверзију у програмски језик по вашем избору.

Табела за брзу референцу

0CURLE_OK

Успех. Операција је завршена без икаквих грешака.

1CURLE_UNSUPPORTED_PROTOCOL

Неподржан протокол. URL користи протокол за који curl није компајлиран.

3CURLE_URL_MALFORMAT

Неисправан URL. Синтакса URL-а је неважећа или није могла бити парсирана.

5CURLE_COULDNT_RESOLVE_PROXY

Не може да разреши прокси. Наведено име хоста проксија није могло бити разрешено.

6CURLE_COULDNT_RESOLVE_HOST

DNS претрага неуспела — име хоста није могло бити разрешено у IP адресу.

7CURLE_COULDNT_CONNECT

TCP повезивање неуспешно — сервер је пао, порт је блокиран или фајервол одбија везе.

18CURLE_PARTIAL_FILE

Делимична датотека. Пренос је прекинут и примљен је само део датотеке.

22CURLE_HTTP_RETURNED_ERROR

Сервер је вратио HTTP грешку (4xx/5xx) и коришћен је --fail флег.

23CURLE_WRITE_ERROR

Грешка при записивању. curl није успео да запише примљене податке на диск (одбијена дозвола или диск пун).

28CURLE_OPERATION_TIMEDOUT

Операција је прекорачила максимално дозвољено време (DNS, повезивање или пренос).

35CURLE_SSL_CONNECT_ERROR

SSL/TLS руковање неуспело — неподударност верзије протокола или скупа шифара.

37CURLE_FILE_COULDNT_READ_FILE

Не може да прочита датотеку. Локална датотека наведена у захтеву није могла бити отворена или прочитана.

52CURLE_GOT_NOTHING

Празан одговор од сервера. Сервер је затворио везу без слања икаквих података.

56CURLE_RECV_ERROR

Веза је ресетована — сервер је прекинуо везу током преноса података.

60CURLE_SSL_CACERT

Верификација SSL сертификата неуспела — истекао, самопотписан или CA пакет је застарео.

77CURLE_SSL_CACERT_BADFILE

Проблем са SSL CA сертификатом. Није могуће прочитати или парсирати наведену датотеку CA сертификата.

92CURLE_HTTP2_STREAM

Грешка HTTP/2 стрима. Дошло је до грешке HTTP/2 протокола на нивоу стрима током преноса.

Грешка 6: Не може да разреши хост

Шта то значи
Ваш терминал приказује curl: (6) Could not resolve host. curl није успео да разреши име хоста у IP адресу — DNS претрага је неуспела пре било каквог покушаја повезивања.
Узроци
Најчешћи узроци су: грешка у куцању имена хоста (нпр. curl https://apiexample.com уместо api.example.com), проблеми са DNS сервером (ваш конфигурисани DNS је пао или недоступан), нема мрежне везе (Wi-Fi искључен, VPN није повезан) или домен заиста не постоји.
Како поправити
Прво проверите да ли је URL исправан. Затим тестирајте DNS резолуцију директно: nslookup api.example.com или dig api.example.com. Ако DNS не успе, пробајте други DNS сервер: curl --dns-servers 8.8.8.8 https://api.example.com. Проверите /etc/resolv.conf или мрежна подешавања. Ако сте иза корпоративног VPN-а, уверите се да интерни DNS може да разреши хост.
$ curl https://api.exmple.com/users

Грешка 7: Повезивање неуспешно

Шта то значи
Ваш терминал приказује curl: (7) Failed to connect to host port: Connection refused. curl је разрешио име хоста, али није успео да успостави TCP везу са сервером — веза је активно одбијена или је истекло време на TCP нивоу.
Узроци
Уобичајени узроци укључују: сервер је пао или не ради, фајервол блокира порт (проверите и локални и серверски фајервол), порт је погрешан (нпр. сервис ради на 8080, а ви се повезујете на 443) или је серверов ред за чекање пун под великим оптерећењем.
Како поправити
Проверите да ли сервер ради: ping api.example.com и telnet api.example.com 443. Проверите да ли је исправан порт отворен: nmap -p 443 api.example.com. Привремено искључите локални фајервол за тестирање. Ако користите Docker, уверите се да је порт контејнера објављен. Пробајте са verbose режимом: curl -v https://api.example.com да видите тачно где веза не успева.
$ curl https://localhost:8080/api

Грешка 22: HTTP вратио грешку

Шта то значи
Ваш терминал приказује curl: (22) The requested URL returned error. Сервер је вратио HTTP статусни код грешке (4xx или 5xx), а curl је покренут са -f или --fail, што налаже curl-у да третира HTTP грешке као неуспехе.
Узроци
Грешку покрећу HTTP статусни кодови попут 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found) или 500 (Internal Server Error) — али само када се користи --fail. Без --fail, curl излази са кодом 0 чак и код HTTP грешака. Уобичајени узроци: погрешан URL, недостајућа аутентификација, недовољне дозволе или грешке на серверу.
Како поправити
Покрените curl без --fail да видите цело тело одговора — оно често садржи стварну поруку о грешци. Проверите HTTP статусни код: curl -w "%{http_code}" -o /dev/null -s URL. За 401/403: проверите ваш auth токен или API кључ. За 404: двапут проверите URL путању. За 500: проблем је на страни сервера.
$ curl --fail https://api.example.com/nonexistent

Грешка 28: Истекло време операције

Шта то значи
Ваш терминал приказује curl: (28) Operation timed out или curl: (28) Connection timed out. Операција је трајала дуже од дозвољеног времена. Ово је најчешћа curl грешка — може настати током DNS резолуције, TCP повезивања, SSL руковања или преноса података.
Узроци
Типични узроци укључују: спор или преоптерећен сервер који не одговара на време, загушење мреже или губитак пакета, фајервол тихо одбацује пакете (без одбијања, само тишина), превише строге вредности тајмаута постављене са --connect-timeout или --max-time, или погрешна конфигурација проксија која узрокује кашњења.
Како поправити
Повећајте тајмаут: curl --connect-timeout 30 --max-time 120 URL. Користите verbose режим да видите где се заглављује: curl -v URL. Тестирајте мрежну латенцију: ping api.example.com и traceroute api.example.com. Ако сте иза проксија, пробајте да га заобиђете: curl --noproxy '*' URL. За пренос великих датотека, размотрите коришћење --retry 3 са --retry-delay 5.
$ curl --connect-timeout 5 https://slow-api.example.com/data

Грешка 35: Грешка SSL повезивања

Шта то значи
Ваш терминал приказује curl: (35) SSL connect error. SSL/TLS руковање је неуспело — curl није успео да успостави безбедну везу са сервером.
Узроци
Уобичајени узроци: неподударност верзије TLS-а (сервер захтева TLS 1.3, а ваш curl подржава само до TLS 1.2), некомпатибилност скупова шифара, погрешна SSL конфигурација сервера (истекао сертификат представљен током руковања, непотпун ланац), сервер заправо не подржава HTTPS на датом порту, или прокси или фајервол пресреће SSL везу (MITM).
Како поправити
Форсирајте одређену верзију TLS-а: curl --tlsv1.2 URL или curl --tlsv1.3 URL. Проверите шта сервер подржава: openssl s_client -connect api.example.com:443. Ажурирајте curl и OpenSSL на најновије верзије. Ако сервер користи самопотписани сертификат, обично је то грешка 60 — грешка 35 обично указује на неуспех руковања на нивоу протокола.
$ curl https://legacy-server.example.com/api

Грешка 56: Неуспех пријема — Веза је ресетована

Шта то значи
Ваш терминал приказује curl: (56) Recv failure: Connection reset by peer. Веза је успешно успостављена, али пријем података је неуспео — сервер је затворио или ресетовао везу неочекивано током преноса.
Узроци
Ово се често дешава када: сервер се сруши или рестартује усред преноса, балансер оптерећења или прокси прекине везу (тајмаут неактивности, захтев превелик), фајервол прекида дуготрајне везе, сервер има keep-alive тајмаут краћи него што се очекује, или постоји мрежни прекид између клијента и сервера.
Како поправити
Пробајте захтев поново — пролазни мрежни проблеми су најчешћи узрок. Користите verbose режим: curl -v URL да видите тачан тренутак неуспеха. Ако се грешка дешава током великих отпремања, пробајте chunked пренос: curl -H "Transfer-Encoding: chunked" URL. За Git операције које приказују RPC failed; curl 56, повећајте бафер: git config http.postBuffer 524288000.
$ curl https://api.example.com/large-download

Грешка 60: Проблем са SSL сертификатом

Шта то значи
Ваш терминал приказује curl: (60) SSL certificate problem: unable to get local issuer certificate. curl није успео да верификује SSL сертификат сервера у односу на свој CA (Certificate Authority) пакет. TLS руковање је завршено на нивоу протокола, али валидација сертификата је неуспела.
Узроци
Најчешћи узроци: сервер користи самопотписани сертификат, сертификат је истекао, ланац сертификата је непотпун (недостају међусертификати), curl-ов CA пакет је застарео (често на старијим системима или у Docker контејнерима), или Common Name / SAN сертификата се не подудара са захтеваним именом хоста.
Како поправити
Ажурирајте CA пакет: curl --cacert /path/to/cacert.pem URL. Преузмите ажуриран пакет са https://curl.se/ca/cacert.pem. За дијагностику: openssl s_client -connect api.example.com:443 -showcerts. За самопотписане сертификате у развоју, користите curl -k URL (никада у продукцији — ово искључује све провере сертификата). У Docker-у, инсталирајте ca-certificates пакет.
$ curl https://self-signed.example.com/api

Остали кодови грешака

0CURLE_OK

Успех. Операција је завршена без икаквих грешака.

1CURLE_UNSUPPORTED_PROTOCOL

Неподржан протокол. URL користи протокол за који curl није компајлиран.

3CURLE_URL_MALFORMAT

Неисправан URL. Синтакса URL-а је неважећа или није могла бити парсирана.

5CURLE_COULDNT_RESOLVE_PROXY

Не може да разреши прокси. Наведено име хоста проксија није могло бити разрешено.

18CURLE_PARTIAL_FILE

Делимична датотека. Пренос је прекинут и примљен је само део датотеке.

23CURLE_WRITE_ERROR

Грешка при записивању. curl није успео да запише примљене податке на диск (одбијена дозвола или диск пун).

37CURLE_FILE_COULDNT_READ_FILE

Не може да прочита датотеку. Локална датотека наведена у захтеву није могла бити отворена или прочитана.

52CURLE_GOT_NOTHING

Празан одговор од сервера. Сервер је затворио везу без слања икаквих података.

77CURLE_SSL_CACERT_BADFILE

Проблем са SSL CA сертификатом. Није могуће прочитати или парсирати наведену датотеку CA сертификата.

92CURLE_HTTP2_STREAM

Грешка HTTP/2 стрима. Дошло је до грешке HTTP/2 протокола на нивоу стрима током преноса.

Како дебаговати curl грешке

Када curl не успе, ова три флега помажу да брзо идентификујете основни узрок — од DNS резолуције до SSL руковања и садржаја одговора.

  1. 1

    Укључите verbose излаз

    Покрените curl -v URL да видите цео циклус захтев/одговор: DNS резолуцију, TCP повезивање, TLS руковање, послата заглавља захтева и примљена заглавља одговора. Ово је најкориснији флег за дебаговање.

  2. 2

    Проверите HTTP статусни код

    Покрените curl -o /dev/null -s -w "%{http_code}" URL да добијете само HTTP статусни код (200, 404, 500 итд.) без тела одговора. Корисно за брзе провере здравља и скриптовање.

  3. 3

    Тихо приказивање грешака

    Покрените curl -sS URL да потиснете траку напретка (-s), али и даље прикажете грешке (-S). Савршено за скрипте где желите чист излаз, али морате да ухватите неуспехе.

Често постављана питања

Како проверити curl излазни код?

Након покретања curl команде, излазни код се чува у специјалној променљивој шела. У Bash/Zsh, покрените echo $? одмах након curl команде. У PowerShell-у, користите $LASTEXITCODE. У скриптама, можете га проверити условом: if curl -sf URL; then echo "OK"; else echo "Failed with code $?"; fi. Излазни код 0 значи успех; било који други број указује на грешку. Да видите и HTTP статусни код и curl излазни код, комбинујте curl -w "%{http_code}" -o /dev/null -s URL; echo "Exit: $?". Имајте на уму да се curl излазни код разликује од HTTP статусног кода — curl враћа 0 чак и за HTTP 404 осим ако не користите --fail флег.

Како поправити curl грешку 28 (истекло време операције)?

Грешка 28 значи да је захтев прекорачио максимално дозвољено време. Прво, повећајте тајмаут: curl --connect-timeout 30 --max-time 120 URL. --connect-timeout ограничава фазу TCP повезивања, док --max-time ограничава целу операцију. Затим, дијагностикујте уско грло помоћу curl -v URL — verbose излаз показује тачно где се curl заглављује (DNS, повезивање, TLS или пренос). Уобичајена решења: проверите мрежну везу и DNS подешавања, проверите да ли сервер одговара (ping и telnet), заобиђите прокси са --noproxy '*' и за велика преузимања додајте --retry 3 --retry-delay 5 за аутоматске поновне покушаје.

Како поправити curl SSL грешке сертификата (грешка 60)?

Грешка 60 значи да curl не може да верификује SSL сертификат сервера. Решење зависи од узрока. За застарео CA пакет: преузмите свеж са https://curl.se/ca/cacert.pem и користите curl --cacert /path/to/cacert.pem URL. За Docker контејнере: инсталирајте ca-certificates пакет (apt-get install ca-certificates). За самопотписане сертификате у развоју: користите curl -k URL да прескочите верификацију — али никада не користите -k у продукцији јер искључује сву проверу сертификата. За дијагностику: покрените openssl s_client -connect host:443 -showcerts да прегледате ланац сертификата. Ако је сертификат истекао или се име хоста не подудара, проблем је на страни сервера.

Шта значи curl грешка 7 (неуспешно повезивање)?

Грешка 7 значи да је curl разрешио име хоста у IP адресу, али није успео да успостави TCP везу. Сервер је активно одбио везу или је покушај повезивања истекао на мрежном нивоу. Уобичајени узроци: сервис не ради на циљном хосту (проверите са systemctl status или docker ps), фајервол блокира порт (тестирајте са telnet host port), користите погрешан порт (нпр. 80 уместо 443, или 8080 за dev сервер), или је серверов ред за чекање пун под великим оптерећењем. За дебаговање: користите curl -v URL и потражите "Connected to" или "Connection refused" у излазу.