Πώς να κατεβάζετε αρχεία με cURL: flags, διορθώσεις και scripts

Τελευταία ενημέρωση στις August 11, 2026
Hand-drawn file download flowing from a terminal window into a verified folder
Σύνοψη AI
Ένας πρακτικός οδηγός για downloads με cURL που καλύπτει redirects, authentication, retries, συνέχιση λήψης, batch scripts, επαλήθευση και συνηθισμένα σημεία αποτυχίας.

Έχω ξοδέψει υπερβολικά πολλές νύχτες διορθώνοντας 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 ταυτόχρονα. Αυτή είναι όλη η αξία του — δεν είναι πιο «εντυπωσιακό», απλώς είναι επαναλήψιμο.

Hand-drawn flow from a web source to a downloaded file and local folder

Τα βασικά 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-Disposition header του 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, ξεκινήστε σκόπιμα από την αρχή αντί να υποθέσετε ότι το μερικό αρχείο είναι ασφαλές.

A resilient cURL download resumes after interruption and finishes with checksum verification

Βήμα 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
wgetRecursive/mirrored downloads ιστότοπων, απλούστερη μαζική λήψη στατικών αρχείων
aria2Multi-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 συχνά καταγράφονται ολόκληρα.

Μέθοδος authenticationFlag/OptionΙδανικό για
Basic auth-u user:passLegacy FTP, απλό HTTP
Bearer token-H "Authorization: Bearer <token>"REST APIs, OAuth2
Cookie auth-b cookies.txt (+ -c για αποθήκευση)Web apps με sessions
Αρχείο .netrc--netrc ή --netrc-fileCI/CD, scripted περιβάλλοντα

Hand-drawn progress blocks, retry arrow, and completed folder

Αντιμετώπιση συνηθισμένων αποτυχιών στο 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

ΕργασίαΕντολή
Βασικό downloadcurl -LO <url>
Προσαρμοσμένο όνομα αρχείουcurl -L -o myfile.zip <url>
Συνέχιση downloadcurl -C - -LO <url>
Αθόρυβη λειτουργία με εμφάνιση σφαλμάτωνcurl -sSL -O <url>
Παράλληλα downloadscurl --parallel --parallel-max 5 -O <url1> -O <url2>
Bearer token authenticationcurl -H "Authorization: Bearer <token>" -LO <url>
Go-to scripted downloadcurl -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.

Μάθετε περισσότερα

Ke
Ke
CTO στη Thunderbit | Senior Data Scientist & ML Expert Με σχεδόν μια δεκαετία εμπειρίας στη μηχανική μάθηση και την επιστήμη δεδομένων, ο Ke Shen είναι απόφοιτος του Columbia University και πρώην Senior Data Scientist στα Walmart Labs. Με βαθιά, αναγνωρισμένη από συναδέλφους τεχνογνωσία σε Python, R, Java και Στατιστική, μοιράζεται δοκιμασμένες στην πράξη γνώσεις για το πώς οι σύνθετοι αλγόριθμοι τεχνητής νοημοσύνης περνούν από τη θεωρία σε αρχιτεκτονική έτοιμη για παραγωγή.
Topics
Λήψη αρχείων με cURLΑυτοματοποίηση από τη γραμμή εντολώνΑξιόπιστη μεταφορά αρχείων
Πίνακας Περιεχομένων
Thunderbit · Πράκτορας δεδομένων ιστού AI

Εξαγωγή δεδομένων από οποιαδήποτε σελίδα σε 1 κλικ

Εμπιστεύονται πάνω από 250.000 χρήστες
διαθέσιμο δωρεάν πρόγραμμα
Εξαγωγή Δεδομένων χρησιμοποιώντας AI
Μεταφέρετε εύκολα δεδομένα σε Google Sheets, Airtable ή Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week