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 სერტიფიკატის გადამოწმება ვერ მოხერხდა — ვადაგასული, self-signed ან 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-ს), ან სერვერის listen backlog სავსეა მაღალი დატვირთვის დროს.
როგორ გამოვასწოროთ
გადაამოწმეთ, რომ სერვერი მუშაობს: 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-ისთვის: გადაამოწმეთ ავტორიზაციის ტოკენი ან 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 უახლეს ვერსიებამდე. თუ სერვერი იყენებს self-signed სერტიფიკატს, ეს ჩვეულებრივ შეცდომა 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. 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 ხელის ჩამორთმევა პროტოკოლის დონეზე დასრულდა, მაგრამ სერტიფიკატის ვალიდაცია ვერ მოხერხდა.
მიზეზები
ყველაზე გავრცელებული მიზეზები: სერვერი იყენებს self-signed სერტიფიკატს, სერტიფიკატის ვადა ამოიწურა, სერტიფიკატის ჯაჭვი არასრულია (აკლია შუალედური სერტიფიკატები), 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. self-signed სერტიფიკატებისთვის დეველოპმენტში გამოიყენეთ 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 ხელის ჩამორთმევამდე და პასუხის payload-მდე.

  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). self-signed სერტიფიკატებისთვის დეველოპმენტში: გამოიყენეთ 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 სერვერისთვის), ან სერვერის listen backlog სავსეა მაღალი დატვირთვის დროს. დიაგნოსტიკისთვის: გამოიყენეთ curl -v URL და მოძებნეთ "Connected to" ან "Connection refused" გამოსავალში.