Τρόπος χρήσης μπούκλα για λήψη αρχείων από τη γραμμή εντολών Linux

Η curlεντολή Linux μπορεί να κάνει πολύ περισσότερα από τη λήψη αρχείων. Μάθετε τι curlείναι ικανό και πότε πρέπει να το χρησιμοποιήσετε αντί wget.

curl vs. wget: Ποια είναι η διαφορά;

Οι άνθρωποι αγωνίζονται συχνά να εντοπίσουν τα σχετικά δυνατά σημεία wgetκαι τις curlεντολές. Οι εντολές έχουν κάποια λειτουργική αλληλεπικάλυψη. Ο καθένας μπορεί να ανακτήσει αρχεία από απομακρυσμένες τοποθεσίες, αλλά εκεί τελειώνει η ομοιότητα.

wgetείναι ένα φανταστικό εργαλείο για τη λήψη περιεχομένου και αρχείων. Μπορεί να κατεβάσει αρχεία, ιστοσελίδες και καταλόγους. Περιέχει έξυπνες ρουτίνες για διασχίζοντας συνδέσμους σε ιστοσελίδες και αναδρομικά λήψη περιεχομένου σε ολόκληρο τον ιστότοπο. Είναι αξεπέραστο ως διαχειριστής λήψης γραμμής εντολών.

curlικανοποιεί μια εντελώς διαφορετική ανάγκη. Ναι, μπορεί να ανακτήσει αρχεία, αλλά δεν μπορεί να περιηγηθεί αναδρομικά σε έναν ιστότοπο που αναζητά περιεχόμενο για ανάκτηση. Αυτό που curlπραγματικά κάνει είναι να σας επιτρέψει να αλληλεπιδράσετε με απομακρυσμένα συστήματα υποβάλλοντας αιτήματα σε αυτά τα συστήματα και ανακτώντας και εμφανίζοντας τις απαντήσεις τους σε εσάς. Αυτές οι απαντήσεις μπορεί κάλλιστα να είναι περιεχόμενο και αρχεία ιστοσελίδας, αλλά μπορούν επίσης να περιέχουν δεδομένα που παρέχονται μέσω μιας υπηρεσίας ιστού ή API ως αποτέλεσμα της «ερώτησης» που υπέβαλε το αίτημα μπούκλας.

Και curlδεν περιορίζεται σε ιστότοπους. curlυποστηρίζει πάνω από 20 πρωτόκολλα, συμπεριλαμβανομένων των HTTP, HTTPS, SCP, SFTP και FTP. Και αναμφισβήτητα, λόγω του ανώτερου χειρισμού των σωλήνων Linux, curlμπορεί να ενσωματωθεί ευκολότερα με άλλες εντολές και σενάρια.

Ο συγγραφέας curlέχει μια ιστοσελίδα που περιγράφει τις διαφορές που βλέπει μεταξύ curlκαι wget.

Εγκατάσταση μπούκλα

Από τους υπολογιστές που χρησιμοποιήθηκαν για την έρευνα αυτού του άρθρου, οι Fedora 31 και Manjaro 18.1.0 είχαν curl ήδη εγκαταστήσει. curlέπρεπε να εγκατασταθεί στο Ubuntu 18.04 LTS. Στο Ubuntu, εκτελέστε αυτήν την εντολή για να την εγκαταστήσετε:

sudo apt-get εγκατάσταση μπούκλα

Η έκδοση curl

Η --versionεπιλογή κάνει την  curlαναφορά την έκδοσή της. Περιλαμβάνει επίσης όλα τα πρωτόκολλα που υποστηρίζει.

μπούκλα - μετατροπή

Ανάκτηση ιστοσελίδας

Εάν δείξουμε curlμια ιστοσελίδα, θα την ανακτήσει για εμάς.

curl //www.bbc.com

Αλλά η προεπιλεγμένη ενέργεια είναι να το πετάξετε στο παράθυρο του τερματικού ως πηγαίος κώδικας.

Προσοχή : Εάν δεν λέτε curlότι θέλετε κάτι αποθηκευμένο ως αρχείο, θα το απορρίπτει πάντα στο παράθυρο του τερματικού. Εάν το αρχείο που ανακτά είναι δυαδικό αρχείο, το αποτέλεσμα μπορεί να είναι απρόβλεπτο. Το κέλυφος μπορεί να προσπαθήσει να ερμηνεύσει μερικές από τις τιμές byte στο δυαδικό αρχείο ως χαρακτήρες ελέγχου ή ακολουθίες διαφυγής.

Αποθήκευση δεδομένων σε αρχείο

Ας πούμε το curl για να ανακατευθύνει την έξοδο σε ένα αρχείο:

curl //www.bbc.com> bbc.html

Αυτή τη φορά δεν βλέπουμε τις ανακτηθείσες πληροφορίες, αποστέλλονται απευθείας στο αρχείο για εμάς. Επειδή δεν υπάρχει έξοδος παραθύρου τερματικού για εμφάνιση, curlεξάγει ένα σύνολο πληροφοριών προόδου.

Δεν το έκανε στο προηγούμενο παράδειγμα, επειδή οι πληροφορίες προόδου θα είχαν διασκορπιστεί σε ολόκληρο τον πηγαίο κώδικα της ιστοσελίδας, οπότε αυτοί τον curlκαταργήσαμε.

Σε αυτό το παράδειγμα,  curlεντοπίζει ότι η έξοδος ανακατευθύνεται σε ένα αρχείο και ότι είναι ασφαλές να δημιουργηθούν οι πληροφορίες προόδου.

Οι παρεχόμενες πληροφορίες είναι:

  • % Σύνολο : Το συνολικό ποσό που θα ανακτηθεί.
  • % Ελήφθη : Το ποσοστό και οι πραγματικές τιμές των δεδομένων που ανακτήθηκαν μέχρι τώρα.
  • % Xferd : Το ποσοστό και η πραγματική αποστολή, εάν μεταφορτώνονται δεδομένα.
  • Μέση ταχύτητα φόρτωσης : Η μέση ταχύτητα λήψης.
  • Μέση ταχύτητα μεταφόρτωσης : Η μέση ταχύτητα μεταφόρτωσης.
  • Σύνολο χρόνου : Η εκτιμώμενη συνολική διάρκεια της μεταφοράς.
  • Χρόνος που ξοδεύτηκε : Ο χρόνος που έχει παρέλθει μέχρι τώρα για αυτήν τη μεταφορά.
  • Χρόνος που απομένει : Ο εκτιμώμενος χρόνος που απομένει για την ολοκλήρωση της μεταφοράς
  • Τρέχουσα ταχύτητα : Η τρέχουσα ταχύτητα μεταφοράς για αυτήν τη μεταφορά.

Επειδή ανακατευθύναμε την έξοδο από curl ένα αρχείο, έχουμε πλέον ένα αρχείο που ονομάζεται "bbc.html".

Κάντε διπλό κλικ σε αυτό το αρχείο θα ανοίξει το προεπιλεγμένο πρόγραμμα περιήγησής σας έτσι ώστε να εμφανίζει την ανακτημένη ιστοσελίδα

Σημειώστε ότι η διεύθυνση στη γραμμή διευθύνσεων του προγράμματος περιήγησης είναι ένα τοπικό αρχείο σε αυτόν τον υπολογιστή και όχι ένας απομακρυσμένος ιστότοπος.

Δεν χρειάζεται να ανακατευθύνουμε την έξοδο για να δημιουργήσουμε ένα αρχείο. Μπορούμε να δημιουργήσουμε ένα αρχείο χρησιμοποιώντας την -oεπιλογή (έξοδος) και λέγοντας curlνα δημιουργήσουμε το αρχείο. Εδώ χρησιμοποιούμε την -oεπιλογή και παρέχουμε το όνομα του αρχείου που θέλουμε να δημιουργήσουμε "bbc.html."

curl -o bbc.html //www.bbc.com

Using a Progress Bar To Monitor Downloads

To have the text-based download information replaced by a simple progress bar, use the -# (progress bar) option.

curl -x -o bbc.html //www.bbc.com

Restarting an Interrupted Download

It is easy to restart a download that has been terminated or interrupted. Let’s start a download of a sizeable file. We’ll use the latest Long Term Support build of Ubuntu 18.04. We’re using the --output option to specify the name of the file we wish to save it into: “ubuntu180403.iso.”

curl --output ubuntu18043.iso //releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso

The download starts and works its way towards completion.

If we forcibly interrupt the download with Ctrl+C , we’re returned to the command prompt, and the download is abandoned.

To restart the download, use the -C (continue at) option. This causes curl to restart the download at a specified point or offset within the target file. If you use a hyphen - as the offset, curl will look at the already downloaded portion of the file and determine the correct offset to use for itself.

curl -C - --output ubuntu18043.iso //releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso

The download is restarted. curl reports the offset at which it is restarting.

Retrieving HTTP headers

With the -I (head) option, you can retrieve the HTTP headers only. This is the same as sending the HTTP HEAD command to a web server.

curl -I www.twitter.com

This command retrieves information only; it does not download any web pages or files.

Downloading Multiple URLs

Using xargs we can download multiple URLs at once. Perhaps we want to download a series of web pages that make up a single article or tutorial.

Copy these URLs to an editor and save it to a file called “urls-to-download.txt.” We can use xargs to treat the content of each line of the text file as a parameter which it will feed to curl, in turn.

//tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#0 //tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#1 //tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#2 //tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#3 //tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#4 //tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#5

This is the command we need to use to have xargs pass these URLs to curl one at a time:

xargs -n 1 curl -O < urls-to-download.txt

Note that this command uses the -O (remote file) output command, which uses an uppercase “O.” This option causes curl to save the retrieved  file with the same name that the file has on the remote server.

The -n 1 option tells xargs to treat each line of the text file as a single parameter.

When you run the command, you’ll see multiple downloads start and finish, one after the other.

Checking in the file browser shows the multiple files have been downloaded. Each one bears the name it had on the remote server.

RELATED:How to Use the xargs Command on Linux

Downloading Files From an FTP Server

Using curl with a File Transfer Protocol (FTP) server is easy, even if you have to authenticate with a username and password. To pass a username and password with curl use the -u (user) option, and type the username, a colon “:”, and the password. Don’t put a space before or after the colon.

This is a free-for-testing FTP server hosted by Rebex. The test FTP site has a pre-set username of “demo”, and the password is “password.” Don’t use this type of weak username and password on a production or “real” FTP server.

curl -u demo:password ftp://test.rebex.net

curl figures out that we’re pointing it at an FTP server, and returns a list of the files that are present on the server.

The only file on this server is a “readme.txt” file, of 403 bytes in length. Let’s retrieve it. Use the same command as a moment ago, with the filename appended to it:

curl -u demo:password ftp://test.rebex.net/readme.txt

The file is retrieved and curl displays its contents in the terminal window.

In almost all cases, it is going to be more convenient to have the retrieved file saved to disk for us, rather than displayed in the terminal window. Once more we can use the -O (remote file) output command to have the file saved to disk, with the same filename that it has on the remote server.

curl -O -u demo:password ftp://test.rebex.net/readme.txt

The file is retrieved and saved to disk. We can use ls to check the file details. It has the same name as the file on the FTP server, and it is the same length, 403 bytes.

ls -hl readme.txt

RELATED:How to Use the FTP Command on Linux

Sending Parameters to Remote Servers

Some remote servers will accept parameters in requests that are sent to them. The parameters might be used to format the returned data, for example, or they may be used to select the exact data that the user wishes to retrieve. It is often possible to interact with web application programming interfaces (APIs) using curl.

As a simple example, the ipify website has an API can be queried to ascertain your external IP address.

curl //api.ipify.org

By adding the format parameter to the command, with the value of “json” we can again request our external IP address, but this time the returned data will be encoded in the JSON format.

curl //api.ipify.org?format=json

Here’s another example that makes use of a Google API. It returns a JSON object describing a book. The parameter you must provide is the International Standard Book Number (ISBN) number of a book. You can find these on the back cover of most books, usually below a barcode. The parameter we’ll use here is “0131103628.”

curl //www.googleapis.com/books/v1/volumes?q=isbn:0131103628

The returned data is comprehensive:

Sometimes curl, Sometimes wget

If I wanted to download content from a website and have the tree-structure of the website searched recursively for that content, I’d use wget.

Αν ήθελα να αλληλεπιδράσω με έναν απομακρυσμένο διακομιστή ή API και πιθανώς να κατεβάσω κάποια αρχεία ή ιστοσελίδες, θα το χρησιμοποιούσα curl. Ειδικά αν το πρωτόκολλο ήταν ένα από τα πολλά που δεν υποστηρίζονται από wget.