Коди помилок 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 — помилка 35 типово вказує на збій рукостискання на рівні протоколу.
$ curl https://legacy-server.example.com/apiПомилка 56: Збій отримання — З'єднання скинуто
- Що це означає
- У терміналі відображається
curl: (56) Recv failure: Connection reset by peer. З'єднання було успішно встановлено, але отримання даних не вдалося — сервер несподівано закрив або скинув з'єднання під час передачі. - Причини
- Це часто трапляється, коли: сервер аварійно завершує роботу або перезапускається під час передачі, балансувальник навантаження або проксі розриває з'єднання (тайм-аут простою, занадто великий запит), фаєрвол розриває довготривалі з'єднання, сервер має тайм-аут keep-alive коротший за очікуваний або є порушення мережі між клієнтом та сервером.
- Як виправити
- Спробуйте повторити запит — тимчасові проблеми мережі є найпоширенішою причиною. Використовуйте детальний режим:
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 (центрів сертифікації). 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.
Як виправити помилку curl 28 (перевищено час операції)?
Помилка 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, щоб перевірити ланцюжок сертифікатів. Якщо сертифікат прострочений або ім'я хоста не відповідає, проблема на стороні сервера.
Що означає помилка curl 7 (не вдалося з'єднатися)?
Помилка 7 означає, що curl розпізнав ім'я хоста у IP-адресу, але не зміг встановити TCP-з'єднання. Сервер активно відхилив з'єднання або спроба з'єднання завершилася тайм-аутом на рівні мережі. Поширені причини: сервіс не запущений на цільовому хості (перевірте за допомогою systemctl status або docker ps), фаєрвол блокує порт (перевірте за допомогою telnet host port), ви використовуєте невірний порт (наприклад, 80 замість 443 або 8080 для сервера розробки), або черга очікування з'єднань сервера заповнена при великому навантаженні. Для налагодження: використовуйте curl -v URL та шукайте «Connected to» або «Connection refused» у виводі.