curl қате кодтары: толық анықтамалық

curl командасы сәтсіз аяқталғанда, ол қате түрін анықтайтын сандық шығу кодын (curl қате коды деп те аталады) қайтарады. curl шығу кодын curl командасынан кейін бірден echo $? орындау арқылы (немесе PowerShell-де $LASTEXITCODE) тексеруге болады. 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 іздеу сәтсіз аяқталды.
Себептері
Ең жиі кездесетін себептер: хост атауындағы қате (мысалы, api.example.com орнына curl https://apiexample.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 қателерін сәтсіздік ретінде қарастыруды нұсқайды.
Себептері
Қате 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found) немесе 500 (Internal Server Error) сияқты HTTP статус кодтарымен іске қосылады — бірақ тек --fail пайдаланылғанда. --fail болмаса, curl HTTP қателерінде де 0 кодымен шығады. Жиі кездесетін себептер: дұрыс емес 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. Қай жерде тоқтап тұрғанын көру үшін 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. Қате үлкен жүктеулер кезінде болса, бөлікті тасымалдауды қолданып көріңіз: curl -H "Transfer-Encoding: chunked" URL. RPC failed; curl 56 көрсететін Git операциялары үшін буферді ұлғайтыңыз: 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 статус кодын тексеру

    Жауап денесіз тек HTTP статус кодын (200, 404, 500 және т.б.) алу үшін curl -o /dev/null -s -w "%{http_code}" URL іске қосыңыз. Жылдам денсаулық тексерулері мен скрипттер үшін пайдалы.

  3. 3

    Қателерді тыныш көрсету

    Прогресс жолағын жасыру (-s) бірақ қателерді көрсету (-S) үшін curl -sS URL іске қосыңыз. Таза шығыс қажет, бірақ сәтсіздіктерді ұстау керек скрипттер үшін тамаша.

Жиі қойылатын сұрақтар

curl шығу кодын қалай тексеруге болады?

curl командасын орындағаннан кейін, шығу коды shell-дің арнайы айнымалысында сақталады. Bash/Zsh-де curl командасынан кейін бірден echo $? іске қосыңыз. 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 статус кодынан ерекше — --fail жалаушасын пайдаланбасаңыз, curl HTTP 404 кезінде де 0 қайтарады.

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 арқылы тексеріңіз), дұрыс емес портты пайдаланып жатырсыз (мысалы, 443 орнына 80 немесе әзірлеу сервері үшін 8080) немесе ауыр жүктеме кезінде серверде тыңдау кезегі толы. Жөндеу үшін: curl -v URL пайдаланып, шығыста "Connected to" немесе "Connection refused" іздеңіз.