Έχω ξοδέψει υπερβολικά πολλές νύχτες διορθώνοντας scripts που υποτίθεται ότι έπρεπε απλώς να «πάρουν ένα αρχείο και να συνεχίσουν». Στις εννέα στις δέκα φορές, ο ένοχος ήταν το cURL που έκανε ακριβώς αυτό που του είχα πει, όχι αυτό που πραγματικά ήθελα. Τελικά, υπάρχει μεγάλη απόσταση ανάμεσα στο «το curl -O δουλεύει» και στο «το curl -O δουλεύει αξιόπιστα σε production».
Αυτό ακριβώς το κενό καλύπτει αυτός ο οδηγός. Το cURL έρχεται προεγκατεστημένο στο macOS, στις περισσότερες διανομές Linux και στα Windows 10 και νεότερα, οπότε είναι πολύ πιθανό να το έχετε ήδη στον υπολογιστή σας. Όμως, ανάμεσα σε σιωπηλές αποτυχίες redirect, μυστηριώδη 403 και το άλμα από το «κατέβασε ένα αρχείο» στο «κατέβασε 500 αρχεία χωρίς να καεί το τερματικό», υπάρχουν πολλά σημεία όπου μπορεί να κολλήσετε. Θα σας δείξω τα flags που έχουν σημασία, τις εντολές βήμα-βήμα που χρησιμοποιώ πραγματικά, τα σφάλματα που μπερδεύουν πιο συχνά τον κόσμο, και το σημείο όπου το cURL πραγματικά δεν φτάνει άλλο — μαζί με το τι να χρησιμοποιήσετε αντί γι’ αυτό.
Τι είναι το cURL (και γιατί να σας νοιάζει);
Το cURL είναι ένα δωρεάν, ανοιχτού κώδικα εργαλείο γραμμής εντολών για μεταφορά δεδομένων προς ή από έναν server μέσω URL. Μιλάει HTTP, HTTPS, FTP, SFTP και πολλά ακόμη πρωτόκολλα, γι’ αυτό το συναντά κανείς παντού: από bash scripts και Dockerfiles μέχρι CI pipelines. Στο παρασκήνιο, η εντολή curl που πληκτρολογείτε στο terminal χρησιμοποιεί το libcurl, τη βιβλιοθήκη μεταφοράς σε C που ενσωματώνουν πολλές εφαρμογές και language bindings. Ένα παράδειγμα είναι το cURL extension της PHP· αντίθετα, το δημοφιλές Requests της Python είναι ξεχωριστός HTTP client βασισμένος στο urllib3 και όχι στο libcurl.
Η τρέχουσα σταθερή έκδοση τη στιγμή που γράφεται αυτό το κείμενο είναι το curl 8.21.0, που κυκλοφόρησε τον Ιούνιο του 2026 — αν και δεν πρέπει να θεωρείτε δεδομένο ότι το λειτουργικό σας διαθέτει ακριβώς αυτό το build. Οι εκδόσεις του curl που διανέμονται μαζί με τα distros συνήθως μένουν πίσω από το upstream project για μήνες, μερικές φορές και περισσότερο, οπότε αξίζει να τρέξετε curl --version πριν υποθέσετε ότι ένα flag όπως το --parallel είναι διαθέσιμο.
Γιατί να κατεβάζετε αρχεία με cURL; Κύριες χρήσεις
Με ρωτούν αρκετά συχνά γιατί να ασχοληθεί κανείς με ένα εργαλείο γραμμής εντολών, αφού οι browsers κατεβάζουν μια χαρά τα αρχεία. Η ειλικρινής απάντηση: οι browsers είναι εξαιρετικοί μέχρι να χρειαστεί να αυτοματοποιήσετε κάτι.
| Χρήση | Γιατί ξεχωρίζει το cURL |
|---|---|
| Λήψη binary files σε CI/CD pipelines | Γράφεται σε script, χωρίς ανάγκη για GUI |
| Ανάκτηση API responses ή exports δεδομένων | Υποστηρίζει custom headers, authentication και piping εξόδου |
| Συνέχιση μεγάλων downloads μέσω SSH | Ενσωματωμένη υποστήριξη συνέχισης (-C -) |
| Αυτοματοποίηση επαναλαμβανόμενων downloads (cron jobs) | Ελαφρύ, συνδυάζεται εύκολα με shell scripts |
| Λήψη αρχείων πίσω από login | Ευέλικτα auth flags (basic, token, cookies, .netrc) |
Ένα download από browser είναι ένα μεμονωμένο, χειροκίνητο κλικ. Το cURL μετατρέπει την ίδια ενέργεια σε κάτι που μπορείτε να προγραμματίσετε, να το συνδέσετε σε pipeline, να το επαναλάβετε σε αποτυχία και να το εκτελέσετε με τον ίδιο ακριβώς τρόπο σε εκατό servers ταυτόχρονα. Αυτή είναι όλη η αξία του — δεν είναι πιο «εντυπωσιακό», απλώς είναι επαναλήψιμο.

Τα βασικά cURL flags για λήψη αρχείων
Επιστρέφω συνέχεια στα ίδια δώδεκα περίπου flags για το 90% όσων κάνω. Να το cheat sheet που θα ήθελα να μου είχαν δώσει πριν από χρόνια, οργανωμένο ανάλογα με το τι κάνουν στην πράξη.
Flags για έξοδο και αποθήκευση αρχείου
-O(--remote-name) αποθηκεύει το αρχείο χρησιμοποιώντας το τελευταίο τμήμα του URL ως όνομα αρχείου. Βολικό, αλλά μπορεί να αντικαταστήσει αθόρυβα ένα υπάρχον αρχείο με το ίδιο όνομα.-o <filename>(--output) σας αφήνει να επιλέξετε ακριβώς το όνομα που θέλετε:curl -o report.pdf https://example.com/downloads/file.pdf.-J(--remote-header-name) χρησιμοποιεί το όνομα αρχείου από τοContent-Dispositionheader του server αντί για αυτό του URL. Είναι πρακτικό για API downloads, αλλά αντιμετωπίστε τα ονόματα που έρχονται από τον server ως μη αξιόπιστη είσοδο — κατεβάζετε σε ξεχωριστό φάκελο και όχι στον home directory σας, σύμφωνα με τις οδηγίες ασφαλείας του ίδιου του curl.
Flags συμπεριφοράς που χρειάζεται κάθε download
-L(--location) λέει στο curl να ακολουθεί HTTP redirects. Χωρίς αυτό, μια 3xx απάντηση αποθηκεύεται ως μικρή HTML σελίδα redirect αντί για το πραγματικό αρχείο — αυτό είναι το πιο συνηθισμένο λάθος του τύπου «γιατί χάλασε το download μου» που βλέπω.-C -(--continue-at -) συνεχίζει ένα download που διακόπηκε από εκεί που σταμάτησε.-s/-Sτρέχουν αθόρυβα αλλά εξακολουθούν να εμφανίζουν σφάλματα — ιδανικά για scripts όπου δεν θέλετε progress bar να γεμίζει τα logs.--limit-rate 1Mπεριορίζει το bandwidth (χρήσιμο σε κοινόχρηστες συνδέσεις ή όταν δεν θέλετε να μονοπωλήσετε ένα metered δίκτυο).--connect-timeout 10και--max-time 300σταματούν μια κολλημένη σύνδεση από το να παγώσει το script σας για πάντα.--retry 3και--retry-delay 5επαναλαμβάνουν αυτόματα σε προσωρινές αποτυχίες — σύμφωνα με το man page του curl, συνδυάστε τα με--retry-all-errorsμόνο όταν είναι πραγματικά ασφαλές να γίνει ακριβώς το ίδιο αίτημα ξανά.
Flags προόδου και debugging
-#εμφανίζει απλό progress bar αντί για το προεπιλεγμένο stats table.-vεμφανίζει verbose output, συμπεριλαμβανομένων όλων των request/response headers — η πρώτη μου επιλογή όταν κάτι δεν συμπεριφέρεται σωστά.-I(--head) φέρνει μόνο τα response headers, κάτι εξαιρετικό ως γρήγορος έλεγχος πριν δεσμευτείτε σε μεγάλο download.-wσας επιτρέπει να τυπώσετε προσαρμοσμένη έξοδο μετά τη μεταφορά, π.χ.curl -o /dev/null -s -w "%{http_code}\n" <url>για να ελέγξετε απλώς έναν status code.
Πριν ξεκινήσετε
- Δυσκολία: Αρχάριος έως μεσαίο επίπεδο (τα τμήματα για batch και authentication είναι λίγο πιο προχωρημένα)
- Απαιτούμενος χρόνος: Περίπου 15-20 λεπτά για να δείτε τις βασικές εντολές
- Τι θα χρειαστείτε: Ένα terminal (macOS Terminal, shell σε Linux ή Windows PowerShell/WSL), εγκατεστημένο curl (ελέγξτε με
curl --version) και ένα test URL — θα χρησιμοποιήσω ως παράδειγμα ένα δημόσιο GitHub release asset, επειδή είναι σταθερό και ελεύθερα προσβάσιμο
Πώς να κατεβάζετε αρχεία με cURL: βήμα προς βήμα
Βήμα 1: Κατεβάστε ένα μόνο αρχείο
Τα απολύτως βασικά: curl -O <url> αποθηκεύει το αρχείο με το αρχικό του όνομα, ενώ το curl -o myfile.zip <url> σας αφήνει να το μετονομάσετε κατά τη λήψη.
curl -LO https://github.com/curl/curl/releases/download/curl-8_21_0/curl-8.21.0.tar.gz
Πλέον βάζω πάντα το -L από προεπιλογή, χωρίς εξαιρέσεις — με έχουν κάψει υπερβολικά πολλές φορές redirects που μετέτρεπαν αθόρυβα ένα «download» σε HTML αρχείο 400 bytes. Θα δείτε έναν μετρητή προόδου να ανεβαίνει στο terminal, και στο τέλος το αρχείο θα βρίσκεται στον τρέχοντα φάκελό σας.
Όταν η εντολή ολοκληρωθεί επιτυχώς, ο μετρητής φτάνει στο 100% και το curl-8.21.0.tar.gz εμφανίζεται στον τρέχοντα κατάλογο. Επιβεβαιώστε το αρχείο πριν το χρησιμοποιήσετε:
ls -lh curl-8.21.0.tar.gz
Βήμα 2: Κατεβάστε και μετονομάστε το αρχείο
Χρησιμοποιήστε το -o όταν θέλετε συγκεκριμένο τοπικό όνομα αρχείου και όχι ό,τι τυχαίνει να έχει στο τέλος το URL:
curl -L -o curl-latest.tar.gz -S https://github.com/curl/curl/releases/download/curl-8_21_0/curl-8.21.0.tar.gz
Το -S εδώ ενεργοποιεί ξανά την εμφάνιση σφαλμάτων, σε περίπτωση που έχετε περάσει και -s κάπου αλλού στο script. Αυτός ο συνδυασμός — -L -o <name> -S — είναι ουσιαστικά η δική μου προεπιλεγμένη εντολή για single-file downloads.
Βήμα 3: Συνεχίστε ένα download που διακόπηκε
Αν ένα μεγάλο download πέσει στη μέση (κακό Wi‑Fi, ένα στιγμιαίο πρόβλημα στο VPN, ό,τι και αν είναι), μη ξεκινήσετε από την αρχή. Τρέξτε:
curl -C - -LO https://example.com/large-file.iso
Η παγίδα: αυτό λειτουργεί μόνο αν ο server υποστηρίζει byte-range requests. Το Accept-Ranges: bytes είναι ένα χρήσιμο θετικό σημάδι, αλλά η απουσία του δεν αποδεικνύει ότι τα ranges δεν υποστηρίζονται. Ο αξιόπιστος έλεγχος είναι η απάντηση του server σε ένα πραγματικό range request: μια επαναλήψιμη απάντηση συνήθως επιστρέφει 206 Partial Content με έγκυρο Content-Range. Τρέξτε την εντολή συνέχισης και επιθεωρήστε το status με -v ή -D -; αν ο server αγνοεί το range ή απορρίπτει το offset, ξεκινήστε σκόπιμα από την αρχή αντί να υποθέσετε ότι το μερικό αρχείο είναι ασφαλές.

Βήμα 4: Κατεβάστε με progress bar ή αθόρυβα
Για πιο καθαρή εικόνα σε διαδραστικό terminal: curl -# -LO <url>. Για scripts και cron jobs όπου θέλετε μόνο σφάλματα και όχι θόρυβο: curl -sS -LO <url>. Εγώ χρησιμοποιώ σχεδόν παντού την αθόρυβη εκδοχή, εκτός αν κάνω debugging με το χέρι.
Βήμα 5: Περιορίστε την ταχύτητα λήψης
Σε κοινόχρηστη σύνδεση γραφείου (ή όταν δεν θέλω να είμαι «αυτός που τρώει όλο το bandwidth» σε ένα video call), περιορίζω την ταχύτητα με:
curl --limit-rate 1M -LO https://example.com/big-dataset.zip
Οι μονάδες είναι K, M και G για kilobytes, megabytes και gigabytes ανά δευτερόλεπτο αντίστοιχα.
Βήμα 6: Αποθηκεύστε τα response headers μαζί με το αρχείο
Κάποιες φορές χρειάζομαι να ξέρω ακριβώς τι έστειλε πίσω ο server — content type, cache headers και τα σχετικά — χωρίς να γεμίζει το terminal:
curl -L -D headers.txt -o file.zip https://example.com/file.zip
Αυτό αποθηκεύει τα response headers στο headers.txt, ενώ το πραγματικό αρχείο πηγαίνει στο file.zip. Πολύ χρήσιμο για debugging σε ασυμφωνίες content-type ή για να επιβεβαιώσετε ότι ένα CDN κάνει όντως cache αυτό που νομίζετε ότι κάνει cache.
Συμβουλές και συνηθισμένες παγίδες
- Συμβουλή: Βάζετε πάντα ως προεπιλογή το
-L. Πραγματικά δεν βρίσκω μειονέκτημα στο να το έχετε, και έχω χάσει ώρες επειδή το ξέχασα. - Συμβουλή: Όταν γράφετε script, συνδυάστε το
--failμε την εντολή download, ώστε μια απάντηση εκτός 2xx να κάνει πραγματικά το script να αποτύχει με σφάλμα, αντί να αποθηκεύσει σιωπηλά μια error page σαν να ήταν το αρχείο σας. - Παγίδα: Μην συνδυάζετε το
-C -με το--remove-on-error— το curl τα καταγράφει ως ασύμβατα, επειδή το resume χρειάζεται το μερικό αρχείο να παραμένει εκεί. - Παγίδα: Το
-Oμπορεί να αντικαταστήσει αρχεία χωρίς προειδοποίηση. Αν κάνετε batch downloads σε κοινόχρηστο φάκελο, χρησιμοποιήστε--output-dirγια να τα κρατάτε οργανωμένα.
Πώς να κατεβάζετε πολλά αρχεία και batch downloads με cURL
Τα παραδείγματα για ένα αρχείο είναι το εύκολο κομμάτι. Τα πραγματικά workflows που έχω στήσει — λήψη καθημερινών data exports, συγχρονισμός binaries σε build servers — χρειάζονταν concurrency, και εκεί είναι που τα περισσότερα tutorials απλώς... σταματούν. Υπάρχουν τρεις προσεγγίσεις που αξίζει να γνωρίζετε, καθεμία ένα βήμα πιο σύνθετη από την προηγούμενη.
Προσέγγιση 1: Πολλά URLs σε μία εντολή cURL
Η πιο απλή επιλογή είναι να παραθέσετε URLs:
curl -LO https://example.com/a.zip -LO https://example.com/b.zip -LO https://example.com/c.zip
Αυτό δουλεύει, αλλά γίνεται σειριακά — το curl τελειώνει εντελώς το ένα αρχείο πριν ξεκινήσει το επόμενο. Οκ για τρία αρχεία, επίπονο για τριακόσια.
Προσέγγιση 2: Παράλληλα downloads με --parallel (curl 7.66+)
Από το curl 7.66 και μετά, μπορείτε να προσθέσετε --parallel (ή -Z) για να κατεβάσετε πολλαπλά URLs ταυτόχρονα:
curl --parallel --parallel-max 5 --remote-name-all \
https://example.com/a.zip https://example.com/b.zip https://example.com/c.zip
Αξίζει να γνωρίζετε ότι το προεπιλεγμένο parallel max είναι στην πραγματικότητα 50, δηλαδή πολύ περισσότερες ταυτόχρονες συνδέσεις απ’ όσες θα χαροποιούσαν οι περισσότεροι servers — ή και το δικό σας δίκτυο. Εγώ ορίζω το --parallel-max ρητά και συντηρητικά — συνήθως 4 έως 8 — αντί να εμπιστεύομαι το default.
Προσέγγιση 3: xargs και Bash loops για concurrency από λίστα URLs
Για μια μεγάλη λίστα URLs σε αρχείο κειμένου, συνήθως καταφεύγω στο xargs:
cat urls.txt | xargs -n1 -P 8 curl -O -L
Ή, αν θέλω περισσότερο έλεγχο για το τι συμβαίνει σε κάθε job, χρησιμοποιώ ένα bash loop με background processes:
while read -r url; do
curl -O -L "$url" &
done < urls.txt
wait
Το wait στο τέλος έχει σημασία — χωρίς αυτό, το script τερματίζει πριν ολοκληρωθούν τα background downloads.
Πότε να επιλέξετε wget ή aria2 αντί για cURL
Θα είμαι ξεκάθαρος: το cURL δεν είναι πάντα το σωστό εργαλείο. Αν χρειάζεται να κάνετε mirror ολόκληρη δενδρική δομή καταλόγων ενός website, το wget -r κάνει recursive crawling από μόνο του με τρόπο που το cURL απλώς δεν σχεδιάστηκε να κάνει. Αν χρειάζεστε multi-source, segmented downloads για μέγιστη ταχύτητα σε ένα τεράστιο αρχείο, το aria2c είναι όντως πιο γρήγορο.
| Εργαλείο | Ιδανικό για |
|---|---|
| cURL | Ακρίβεια, scripting, downloads ενός αρχείου ή μικρών batch, αλληλεπίδραση με APIs |
| wget | Recursive/mirrored downloads ιστότοπων, απλούστερη μαζική λήψη στατικών αρχείων |
| aria2 | Multi-source/segmented downloads, μέγιστη απόδοση σε μεγάλα αρχεία |
Η δύναμη του cURL ήταν πάντα η ακρίβεια και η συνθεσιμότητα — piping, scripting, ευελιξία σε πρωτόκολλα — όχι το brute-force crawling.
Πώς να κατεβάζετε προστατευμένα αρχεία με cURL: μοτίβα authentication
Τα περισσότερα tutorials για cURL σταματούν στο -u user:pass και θεωρούν ότι τελείωσαν. Αυτό είναι κατάλοιπο μιας παλιότερης εποχής του internet. Το 2026, τα αρχεία που κατεβάζω συνήθως προέρχονται από REST APIs, dashboards με sessions και συστήματα CI — και το καθένα θέλει διαφορετικό είδος διαπιστευτηρίων.
Basic Auth
curl -u username:password -O https://legacy-server.example.com/file.zip
Είναι οκ για παλιούς FTP servers ή απλά HTTP endpoints. Να ξέρετε όμως ότι ο κωδικός εμφανίζεται στο shell history και στη λίστα διεργασιών αν δεν προσέξετε — δεν είναι κάτι που θα χρησιμοποιούσα για οτιδήποτε ευαίσθητο.
Bearer / OAuth Token Auth
Αυτό είναι το μοτίβο που εμφανίζεται λιγότερο απ’ όσο θα έπρεπε στους περισσότερους οδηγούς, και είναι αυτό που χρησιμοποιώ πιο συχνά πλέον:
curl -H "Authorization: Bearer $GITHUB_TOKEN" \
-LO https://api.github.com/repos/curl/curl/releases/assets/12345
Είναι πραγματικό μοτίβο για να κατεβάσετε private GitHub release asset — βάλτε το δικό σας token και asset ID. Τα REST APIs και οι πόροι που προστατεύονται με OAuth2 μιλούν έτσι σχεδόν παντού πλέον.
Cookie-Based Session Auth
Για web apps όπου το login δημιουργεί session, αποθηκεύστε το cookie jar στο login και επαναχρησιμοποιήστε το στο download:
curl -c cookies.txt -d "user=me&pass=secret" https://example.com/login
curl -b cookies.txt -O https://example.com/protected/file.zip
Αρχείο .netrc για scripted και CI περιβάλλοντα
Η προτιμώμενη μέθοδός μου για οτιδήποτε τρέχει χωρίς επίβλεψη. Δημιουργήστε ένα αρχείο ~/.netrc (ή _netrc στα Windows):
machine example.com
login myusername
password mypassword
Κλειδώστε το με chmod 600 ~/.netrc, και μετά χρησιμοποιήστε το με:
curl --netrc -LO https://example.com/protected-file.zip
Το πλεονέκτημα είναι ότι τα credentials δεν αγγίζουν ποτέ το shell history ή τον πηγαίο κώδικα του script — κάτι πραγματικά σημαντικό σε CI/CD, όπου τα scripts συχνά καταγράφονται ολόκληρα.
| Μέθοδος authentication | Flag/Option | Ιδανικό για |
|---|---|---|
| Basic auth | -u user:pass | Legacy FTP, απλό HTTP |
| Bearer token | -H "Authorization: Bearer <token>" | REST APIs, OAuth2 |
| Cookie auth | -b cookies.txt (+ -c για αποθήκευση) | Web apps με sessions |
Αρχείο .netrc | --netrc ή --netrc-file | CI/CD, scripted περιβάλλοντα |

Αντιμετώπιση συνηθισμένων αποτυχιών στο cURL download
Αυτό είναι το τμήμα που θα ήθελα πραγματικά να υπήρχε όταν ξεκινούσα, γιατί σχεδόν κανείς δεν το καλύπτει. Το «γιατί δεν δουλεύει το curl download μου» είναι μια πραγματική, συχνή και εκνευριστική αναζήτηση — και οι διορθώσεις συνήθως είναι μία γραμμή, μόλις ξέρετε την αιτία.
| Σύμπτωμα | Πιθανή αιτία | Διόρθωση |
|---|---|---|
curl: (60) SSL certificate problem | Αυτοϋπογεγραμμένο ή ληγμένο cert | --cacert <file> ή -k (μόνο για dev) |
403 Forbidden / κενό αρχείο | Ο server μπλοκάρει το default user agent του curl | -A "Mozilla/5.0..." ή -H "User-Agent: ..." |
Το download ξεκινά από το 0 με -C - | Ο server δεν υποστηρίζει Range | Ελέγξτε με curl -I <url> το Accept-Ranges: bytes |
| Αποθηκεύεται αρχείο 0 bytes | Δεν ακολουθήθηκε redirect | Προσθέστε το flag -L |
curl: (28) Operation timed out | Αργός server ή προβλήματα δικτύου | --connect-timeout 10 --max-time 300 + --retry 3 |
| Αποθηκεύτηκε HTML σελίδα αντί για αρχείο | Η σελίδα απαιτεί rendering από JavaScript | Το curl δεν εκτελεί JS — δείτε την παρακάτω ενότητα |
Σφάλματα SSL certificate: τι σημαίνουν και πώς διορθώνονται
Το σφάλμα 60 σημαίνει ότι το curl δεν μπόρεσε να επαληθεύσει το SSL certificate του server — συνήθως επειδή είναι self-signed, ληγμένο ή εκδόθηκε από CA που το curl δεν εμπιστεύεται. Αν ελέγχετε εσείς τον server, δείξτε στο curl το σωστό CA bundle με --cacert /path/to/ca.pem. Το -k (--insecure) παρακάμπτει εντελώς την επαλήθευση, κάτι οκ για ένα τοπικό περιβάλλον ανάπτυξης και πολύ κακή ιδέα για οτιδήποτε αγγίζει production ή πραγματικά δεδομένα χρηστών.
403 Forbidden και κενά downloads
Ένας εκπληκτικά μεγάλος αριθμός servers μπλοκάρει αιτήματα που δηλώνουν curl/8.21.0 (τη default συμβολοσειρά User-Agent του curl), θεωρώντας τα bot ή scraper traffic. Η λύση συνήθως είναι απλώς να προσποιηθείτε ότι είστε browser:
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" -LO https://example.com/file.zip
Για να δείτε τι επιστρέφει πραγματικά ο server πριν ξεκινήσετε πλήρες download, τρέχω: curl -o /dev/null -s -w "%{http_code}\n" <url>.
Timeouts, retries και ασταθείς συνδέσεις
Αυτή είναι η εντολή που θα έκανα tattoo στο χέρι μου αν ήμουν πιο γενναίος με τα tattoo.
Η δική μου go-to εντολή download, αυτή που χρησιμοποιώ πραγματικά σε production scripts, συνδυάζει όλα τα flags αξιοπιστίας:
curl -L -C - --retry 5 --retry-delay 3 --connect-timeout 10 --max-time 600 --fail -O <url>
Δηλαδή ακολουθεί redirects, συνεχίζει το download, κάνει πέντε retries με καθυστέρηση 3 δευτερολέπτων, έχει timeout σύνδεσης 10 δευτερολέπτων, συνολικό όριο 10 λεπτών και αποτυγχάνει σκληρά σε κακό HTTP status — basically όλα όσα έμαθα με τον δύσκολο τρόπο ότι πρέπει να βάζω.
cURL σε πραγματική αυτοματοποίηση: CI/CD pipelines, piping και ασφάλεια script
Πώς να κάνετε pipe την έξοδο του cURL σε άλλα εργαλεία
Το curl δεν χρειάζεται να αποθηκεύει τίποτα στον δίσκο — το να το κάνετε pipe απευθείας σε άλλη εντολή είναι ένα από τα πιο υποτιμημένα χαρακτηριστικά του:
curl -sL https://example.com/archive.tar.gz | tar xz
curl -s https://api.example.com/data | jq '.results'
Κατεβάστε και αποσυμπιέστε ή κατεβάστε και αναλύστε, σε μία γραμμή. Αυτό είναι το μοτίβο που χρησιμοποιώ συνεχώς για περιστασιακές λήψεις δεδομένων.
Χρήση του cURL σε GitHub Actions και CI/CD
Ένα minimal βήμα σε GitHub Actions που κατεβάζει binary με retry logic και αποτυγχάνει δυνατά σε σφάλμα:
- name: Download binary
run: |
curl -L --fail --retry 3 --retry-delay 5 \
-o app-binary "https://example.com/releases/app-binary"
Αποθηκεύστε τυχόν tokens ως CI secrets και αναφέρετέ τα μέσω environment variables — ποτέ hardcode μέσα στο ίδιο το script. Και χρησιμοποιήστε --fail (ή --fail-with-body αν χρειάζεστε το error body για debugging), ώστε ένα χαλασμένο download να χαλάει πραγματικά το build αντί να περνάει σιωπηλά με σκουπίδια.
Το ζήτημα ασφαλείας του curl | sh
Αυτό εμφανίζεται σχεδόν σε κάθε forum προγραμματιστών που έχω διαβάσει, και δικαιολογημένα: το να κάνετε pipe το curl απευθείας στο sh σημαίνει ότι εκτελείτε απομακρυσμένο κώδικα που δεν έχετε διαβάσει, βασιζόμενοι αποκλειστικά στην εμπιστοσύνη ότι ο server δεν έχει παραβιαστεί και η σύνδεση δεν έχει αλλοιωθεί. Αυτός είναι ο πραγματικός κίνδυνος — όχι παρανοϊκή σκέψη, αλλά ένα ξεκάθαρο supply-chain θέμα.
Το πιο ασφαλές μοτίβο είναι να κατεβάσετε πρώτα το script, να το επιθεωρήσετε, να επαληθεύσετε checksum ή GPG signature αν παρέχεται, και μόνο τότε να το εκτελέσετε:
curl -sL https://example.com/install.sh -o install.sh
cat install.sh # διαβάστε το πραγματικά
sha256sum install.sh # συγκρίνετε με το δημοσιευμένο checksum αν υπάρχει
bash install.sh
Γνωστοί installers όπως το rustup και το Homebrew εξακολουθούν να χρησιμοποιούν το μοτίβο curl | sh, και γενικά θεωρείται αποδεκτό σε αυτές τις συγκεκριμένες περιπτώσεις επειδή οι maintainers και το κανάλι διανομής είναι καλά εδραιωμένα. Παρ’ όλα αυτά, εγώ προτιμώ να ξοδέψω τα επιπλέον δέκα δευτερόλεπτα για να ελέγξω ένα script, παρά να ανακαλύψω με τον δύσκολο τρόπο ότι δεν έπρεπε να το εμπιστευτώ.
Όταν το cURL δεν αρκεί: σελίδες με JS, anti-bot sites και structured data
Υπάρχει ένα failure mode που μπερδεύει πολλούς ανθρώπους και σπάνια φταίνε οι ίδιοι: τρέχετε curl -O σε κάτι που μοιάζει με κανονική σελίδα και, αντί για το περιεχόμενο που περιμένατε, παίρνετε ένα κενό HTML shell, ή μια σελίδα challenge του Cloudflare, ή κάτι που μοιάζει με σκουπίδι. Το curl έκανε ακριβώς αυτό για το οποίο σχεδιάστηκε — έφερε την ακατέργαστη HTTP απόκριση — απλώς δεν μπορεί να εκτελέσει JavaScript, να λύσει CAPTCHA ή να περάσει από anti-bot fingerprinting σύστημα. Αυτά δεν είναι bugs του curl· βρίσκονται εντελώς έξω από την αποστολή του.
Γιατί το cURL αποτυγχάνει σε σύγχρονες web σελίδες
Τα σύγχρονα single-page apps συχνά επιστρέφουν ένα σχεδόν κενό HTML skeleton, με το πραγματικό περιεχόμενο να αποδίδεται client-side από JavaScript μετά το φόρτωμα της σελίδας — κάτι που το curl δεν εκτελεί ποτέ. Επιπλέον, συστήματα όπως το Cloudflare και το Akamai στέλνουν ενεργά challenge pages σε οτιδήποτε δεν μοιάζει με πραγματικό browser, ενώ τα επαναλαμβανόμενα curl requests από το ίδιο IP μπορούν πολύ γρήγορα να θεωρηθούν bot traffic ή να περιοριστούν με rate limiting.
Το επόμενο βήμα: AI scraping APIs για developers
Θα έλεγα ότι το curl είναι το σωστό εργαλείο για περίπου το 80% των αρχείων και downloads δεδομένων εκεί έξω — στατικά assets, API responses, οτιδήποτε σερβίρεται ως απλό HTTP resource. Το υπόλοιπο 20%, δηλαδή οι σελίδες με πολύ JavaScript ή με προστασία από bots, είναι εκεί όπου έχω δει developers να χάνουν ώρες παλεύοντας με headers και user-agent strings πριν τελικά τα παρατήσουν και περάσουν σε ένα διαφορετικό επίπεδο λύσης.
Αυτό είναι πραγματικά το κενό που η ομάδα μου έκλεισε με το Thunderbit, μαζί με το Chrome extension για το οποίο μας γνωρίζει ο περισσότερος κόσμος. Στην πλευρά των developers, το Open API του Thunderbit σας δίνει το POST /distill, που επιστρέφει καθαρό, έτοιμο για LLM Markdown από ένα URL — με το rendering της σελίδας να το αναλαμβάνει η υπηρεσία — και το POST /extract, που επιστρέφει structured JSON ευθυγραμμισμένο με schema όταν χρειάζεστε πραγματικά πεδία δεδομένων αντί για αναγνώσιμο κείμενο. Υπάρχει επίσης MCP server, ώστε agents σε Claude ή Cursor να μπορούν να καλέσουν thunderbit_distill και thunderbit_extract στη διάρκεια μιας εργασίας, και ένα CLI (npx @thunderbit/thunderbit-cli distill <url>) που συμπεριφέρεται αρκετά σαν το curl στο terminal σας. Στείλτε JSON output στο jq, για παράδειγμα thunderbit distill <url> --format json | jq -r '.data.markdown'; ή στείλτε output --format markdown σε ένα εργαλείο κειμένου ή σε αρχείο.
Σε άμεση σύγκριση, η διαφορά είναι ξεκάθαρη. Ένα curl request σε μια product page με JS rendering μπορεί να επιστρέψει ένα σχεδόν άδειο <div id="root"></div>. Η αντίστοιχη εντολή thunderbit distill επιστρέφει το rendered περιεχόμενο της σελίδας σε καθαρό Markdown. Το Distill κοστίζει 1 credit ανά URL και το Extract 20 credits ανά URL. Τα τρέχοντα όρια ανά endpoint διαφέρουν: το Batch Distill υποστηρίζει έως 100 URLs ανά job, ενώ το Batch Extract δέχεται έως 50 URLs με ένα κοινό schema. Ελέγξτε τη σημερινή API τεκμηρίωση πριν προγραμματίσετε μια production queue.
Αν είστε γενικά πιο νέοι σε αυτή την έννοια, ο δικός μας οδηγός για τι σημαίνει πραγματικά web scraping είναι ένα καλό σημείο εκκίνησης, και ο οδηγός scraping χωρίς κώδικα καλύπτει την πλευρά του ίδιου προβλήματος για όποιον στην ομάδα σας δεν πρόκειται να πιάσει terminal. Για μια ευρύτερη σύγκριση εργαλείων σε αυτόν τον χώρο, έχουμε επίσης ετοιμάσει μια παρουσίαση των καλύτερων AI web scrapers που αξίζει να γνωρίζετε.
Γρήγορη αναφορά: cURL download cheat sheet
| Εργασία | Εντολή |
|---|---|
| Βασικό download | curl -LO <url> |
| Προσαρμοσμένο όνομα αρχείου | curl -L -o myfile.zip <url> |
| Συνέχιση download | curl -C - -LO <url> |
| Αθόρυβη λειτουργία με εμφάνιση σφαλμάτων | curl -sSL -O <url> |
| Παράλληλα downloads | curl --parallel --parallel-max 5 -O <url1> -O <url2> |
| Bearer token authentication | curl -H "Authorization: Bearer <token>" -LO <url> |
| Go-to scripted download | curl -LO --retry 5 --retry-delay 3 --max-time 600 --fail <url> |
| Pipe σε εργαλείο εξαγωγής | curl -sL <url> | tar xz |
Συμπέρασμα και βασικά συμπεράσματα
Η λήψη ενός αρχείου με curl ξεκινά απλά — curl -O και κατά βάση τελειώσατε — αλλά η πραγματική δεξιότητα βρίσκεται στα επίπεδα από κάτω: πότε να προσθέσετε -L, πότε να συνεχίσετε αντί να ξεκινήσετε από την αρχή, ποιο μοτίβο authentication ταιριάζει πραγματικά στη ροή εργασίας σας και τι να κάνετε τη στιγμή που εμφανιστεί ένα 403 ή ένα κενό HTML shell αντί για το αναμενόμενο αρχείο σας. Έχω στηριχτεί σε καθένα από αυτά τα μοτίβα κάποια στιγμή, συνήθως αμέσως μετά που έμαθα με τον δύσκολο τρόπο γιατί είχε σημασία.
Το curl παραμένει, χωρίς αμφιβολία, το default εργαλείο μου για απλές λήψεις αρχείων και scriptable HTTP εργασία — είναι γρήγορο, παντού διαθέσιμο και συνεργάζεται εξαιρετικά με το υπόλοιπο shell pipeline. Όταν όμως πέσετε σε σελίδα με JavaScript rendering ή σε anti-bot φράγμα, αυτό δεν είναι πρόβλημα του curl που λύνεται με περισσότερα flags· είναι σημάδι ότι χρειάζεστε άλλο επίπεδο λύσης, και εκεί ακριβώς αναλαμβάνει ένα API όπως του Thunderbit χωρίς να σας βγάζει από το terminal.
Κρατήστε το cheat sheet στα bookmarks, δοκιμάστε την εντολή retry-and-resume στο επόμενο ασταθές download σας, και αν φτάσετε σε εκείνο το σημείο όπου το curl επιστρέφει απλώς σκουπίδια, ξέρετε ποιο είναι το επόμενο βήμα — η σελίδα τιμολόγησης του Thunderbit δείχνει την τρέχουσα κατανομή credits αν θέλετε να δείτε τι κοστίζει αυτή η μετάβαση, και το κανάλι μας στο YouTube έχει walkthroughs αν προτιμάτε να βλέπετε παρά να διαβάζετε.
Συχνές ερωτήσεις για λήψη αρχείων με cURL
Πώς κατεβάζω ένα αρχείο με cURL και το αποθηκεύω με συγκεκριμένο όνομα;
Χρησιμοποιήστε το -o και μετά το όνομα που θέλετε: curl -L -o yourname.ext <url>. Προσθέστε -L ώστε τα redirects να μην εκτροχιάσουν το download.
Πώς συνεχίζω ένα αποτυχημένο cURL download;
Τρέξτε curl -C - -LO <url>. Αυτό λειτουργεί μόνο αν ο server υποστηρίζει range requests — ελέγξτε πρώτα με curl -I <url> και κοιτάξτε για Accept-Ranges: bytes στην απάντηση.
Μπορεί το cURL να κατεβάσει αρχεία που απαιτούν login;
Ναι, με τέσσερις βασικούς τρόπους: basic auth (-u user:pass), bearer tokens (-H "Authorization: Bearer <token>"), cookie-based sessions (-b cookies.txt) ή ένα .netrc αρχείο για scripted περιβάλλοντα. Δείτε την ενότητα για authentication παραπάνω για πλήρη ανάλυση και πότε ταιριάζει το καθένα.
Ποια είναι η διαφορά ανάμεσα στο cURL και το wget για λήψη αρχείων;
Το cURL υποστηρίζει περισσότερα πρωτόκολλα και είναι γενικά καλύτερο για scripting, piping και ακριβείς λήψεις ενός αρχείου ή μικρών batch. Το wget είναι φτιαγμένο για recursive crawling και mirroring ολόκληρων φακέλων ιστότοπων, κάτι που το καθιστά καλύτερη επιλογή για μαζική λήψη στατικών site.
Γιατί το cURL κατεβάζει μια HTML σελίδα αντί για το πραγματικό αρχείο;
Δύο συνήθεις αιτίες: ξεχάσατε το -L και ο server σας ανακατεύθυνε αλλού, ή η σελίδα απαιτεί JavaScript για να αποδώσει το πραγματικό της περιεχόμενο — κάτι που το curl απλώς δεν μπορεί να εκτελέσει. Στη δεύτερη περίπτωση, θα χρειαστείτε εργαλείο με δυνατότητα rendering, όχι περισσότερα curl flags.


