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 სერტიფიკატის გადამოწმება ვერ მოხერხდა — ვადაგასული, self-signed ან 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-ს), ან სერვერის 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სხვა შეცდომის კოდები
წარმატება. ოპერაცია დასრულდა ყოველგვარი შეცდომის გარეშე.
მხარდაუჭერელი პროტოკოლი. URL იყენებს პროტოკოლს, რომლის მხარდაჭერით curl არ არის აგებული.
არასწორი URL. URL-ის სინტაქსი არავალიდურია ან ვერ მოხერხდა მისი ანალიზი.
პროქსის ამოხსნა ვერ მოხერხდა. მითითებული პროქსის ჰოსტის სახელი ვერ ამოიხსნა.
ნაწილობრივი ფაილი. გადაცემა შეწყდა და ფაილის მხოლოდ ნაწილი იქნა მიღებული.
ჩაწერის შეცდომა. curl-მა ვერ შეძლო მიღებული მონაცემების დისკზე ჩაწერა (წვდომა უარყოფილია ან დისკი სავსეა).
ფაილის წაკითხვა ვერ მოხერხდა. მოთხოვნაში მითითებული ლოკალური ფაილი ვერ გაიხსნა ან ვერ წაიკითხა.
ცარიელი პასუხი სერვერიდან. სერვერმა დახურა კავშირი მონაცემთა გაგზავნის გარეშე.
SSL CA სერტიფიკატის პრობლემა. ვერ მოხერხდა მითითებული CA სერტიფიკატის ფაილის წაკითხვა ან ანალიზი.
HTTP/2 სტრიმის შეცდომა. HTTP/2 პროტოკოლის დონის სტრიმის შეცდომა მოხდა გადაცემის დროს.
როგორ მოვახდინოთ curl შეცდომების დიაგნოსტიკა
როდესაც curl ვერ სრულდება, ეს სამი ფლაგი დაგეხმარებათ სწრაფად დაადგინოთ ძირითადი მიზეზი — DNS ამოხსნიდან SSL ხელის ჩამორთმევამდე და პასუხის payload-მდე.
- 1
ჩართეთ verbose გამოსავალი
გაუშვით
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-ით — 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" გამოსავალში.