Кодове за грешки на curl: Пълен справочник
Когато команда curl се провали, тя връща числов изходен код (наричан също код за грешка на curl), който идентифицира вида на грешката. Можете да проверите изходния код на curl, като изпълните echo $? непосредствено след командата curl (или $LASTEXITCODE в PowerShell). Изходен код 0 означава успех; всяко друго число указва конкретен проблем — от неуспешно DNS разрешаване и таймаути на връзката до проблеми с SSL сертификати. Тази страница е пълен справочник на най-често срещаните кодове за грешки на curl с обяснения, причини и решения. Ако работите с curl команди във вашия код, поставете ги в curl2code, за да ги конвертирате в избрания от вас програмен език.
Таблица за бърза справка
Успех. Операцията завърши без грешки.
Неподдържан протокол. URL адресът използва протокол, за който curl не е компилиран.
Некоректен URL. Синтаксисът на URL адреса е невалиден или не може да бъде разпознат.
Не може да се намери прокси. Указаното име на прокси хост не може да бъде намерено.
DNS заявката е неуспешна — името на хоста не може да бъде преобразувано в IP адрес.
TCP връзката е неуспешна — сървърът е спрял, портът е блокиран или защитната стена отхвърля връзки.
Непълен файл. Прехвърлянето беше прекъснато и само част от файла беше получена.
Сървърът върна HTTP грешка (4xx/5xx) и флагът --fail е бил използван.
Грешка при запис. curl не успя да запише получените данни на диска (отказан достъп или пълен диск).
Операцията надхвърли максималното допустимо време (DNS, свързване или прехвърляне).
SSL/TLS хендшейкът е неуспешен — несъвместимост на версията на протокола или шифрите.
Не може да се прочете файл. Локален файл, посочен в заявката, не може да бъде отворен или прочетен.
Празен отговор от сървъра. Сървърът затвори връзката, без да изпрати каквито и да е данни.
Връзката беше нулирана — сървърът прекъсна връзката по време на прехвърляне на данни.
Проверката на SSL сертификата е неуспешна — изтекъл, самоподписан или CA пакетът е остарял.
Проблем с SSL CA сертификат. Не може да се прочете или анализира посоченият CA сертификатен файл.
Грешка в 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, уверете се, че портът на контейнера е публикуван. Опитайте с подробен режим: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. Без--failcurl излиза с код 0 дори при HTTP грешки. Чести причини: грешен URL, липсващо удостоверяване, недостатъчни права или грешки от страна на сървъра. - Как да се поправи
- Стартирайте curl без
--fail, за да видите пълното тяло на отговора — то често съдържа действителното съобщение за грешка. Проверете HTTP статус кода:curl -w "%{http_code}" -o /dev/null -s URL. За 401/403: проверете вашия токен за удостоверяване или 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. Използвайте подробен режим, за да видите къде спира: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 от очакваното или има мрежово прекъсване между клиента и сървъра.
- Как да се поправи
- Опитайте заявката отново — преходните мрежови проблеми са най-честата причина. Използвайте подробен режим:
curl -v URL, за да видите точната точка на провал. Ако грешката се появява при големи качвания, опитайте частично прехвърляне: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 хендшейкът завърши на ниво протокол, но валидирането на сертификата е неуспешно. - Причини
- Най-честите причини: сървърът използва самоподписан сертификат, сертификатът е изтекъл, веригата от сертификати е непълна (липсват междинни сертификати), CA пакетът на curl е остарял (често при по-стари системи или 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Други кодове за грешки
Успех. Операцията завърши без грешки.
Неподдържан протокол. URL адресът използва протокол, за който curl не е компилиран.
Некоректен URL. Синтаксисът на URL адреса е невалиден или не може да бъде разпознат.
Не може да се намери прокси. Указаното име на прокси хост не може да бъде намерено.
Непълен файл. Прехвърлянето беше прекъснато и само част от файла беше получена.
Грешка при запис. curl не успя да запише получените данни на диска (отказан достъп или пълен диск).
Не може да се прочете файл. Локален файл, посочен в заявката, не може да бъде отворен или прочетен.
Празен отговор от сървъра. Сървърът затвори връзката, без да изпрати каквито и да е данни.
Проблем с SSL CA сертификат. Не може да се прочете или анализира посоченият CA сертификатен файл.
Грешка в HTTP/2 поток. Възникна грешка на ниво HTTP/2 протокол по време на прехвърлянето.
Как да дебъгвате грешки на curl
Когато curl се провали, тези три флага ви помагат бързо да идентифицирате основната причина — от DNS резолюция до SSL хендшейк до съдържание на отговора.
- 1
Включете подробен изход
Изпълнете
curl -v URL, за да видите пълния цикъл заявка/отговор: DNS резолюция, TCP свързване, TLS хендшейк, изпратени хедъри на заявката и получени хедъри на отговора. Това е най-полезният флаг за дебъгване. - 2
Проверете HTTP статус кода
Изпълнете
curl -o /dev/null -s -w "%{http_code}" URL, за да получите само HTTP статус кода (200, 404, 500 и т.н.) без тялото на отговора. Полезно за бързи проверки на състоянието и скриптове. - 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.
Как да поправя грешка 28 на curl (операцията изтече)?
Грешка 28 означава, че заявката надхвърли максималното допустимо време. Първо, увеличете таймаута: curl --connect-timeout 30 --max-time 120 URL. --connect-timeout ограничава фазата на TCP свързване, докато --max-time ограничава цялата операция. След това диагностицирайте тесното място с curl -v URL — подробният изход показва точно къде curl спира (DNS, свързване, TLS или прехвърляне). Чести решения: проверете мрежовата връзка и DNS настройките, уверете се, че сървърът отговаря (ping и telnet), заобиколете проксита с --noproxy '*' и за големи изтегляния добавете --retry 3 --retry-delay 5 за автоматични повторни опити.
Как да поправя SSL грешки на curl (грешка 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, за да прегледате веригата от сертификати. Ако сертификатът е изтекъл или хостът не съвпада, проблемът е от страна на сървъра.
Какво означава грешка 7 на curl (неуспешно свързване)?
Грешка 7 означава, че curl намери IP адреса на хоста, но не успя да установи TCP връзка. Сървърът активно отказа връзката или опитът за свързване изтече на мрежово ниво. Чести причини: услугата не работи на целевия хост (проверете с systemctl status или docker ps), защитна стена блокира порта (тествайте с telnet host port), използвате грешен порт (напр. 80 вместо 443 или 8080 за сървър за разработка) или буферът за изчакване на сървъра е пълен при голямо натоварване. За дебъгване: използвайте curl -v URL и търсете "Connected to" или "Connection refused" в изхода.