How to use Curl Command

How to use Curl Command? | Tutorial

Curl is both a command line utility and library. One can use it to download or transfer of data/files using many different protocols such as HTTP, HTTPS, FTP, SFTP and more. The curl command line utility lets you fetch a given URL or file from the bash shell. This page explains how to download files with curl command on a Linux, macOS, *BSD and Unix-like operating systems.

Author: Vivek Gite

How to download a file with curl command?

The basic syntax:

  1. Grab files with curl run: curl https://your-domain/file.pdf
  2. Get files using ftp or sftp protocol: curl ftp://ftp-your-domain-name/file.tar.gz
  3. You can set the output file name while downloading file with the curl, execute: curl -o file.pdf https://your-domain-name/long-file-name.pdf
  4. Follow a 301-redirected file while downloading files with curl, run: curl -L -o file.tgz

Let us see some examples and usage about the curl to download and upload files on Linux or Unix-like systems.

Installing curl on Linux or Unix

By default curl is installed on many Linux distros and Unix-like systems. But, we can install it as follows:

## Debian/Ubuntu Linux use the apt command/apt-get command ##
$ sudo apt install curl
## Fedora/CentOS/RHEL users try dnf command/yum command ##
$ sudo dnf install curl
## OpenSUSE Linux users try zypper command ##
$ sudo zypper install curl

Verify installation by displaying curl version


$ curl --version

We see:

curl 7.66.0 (x86_64-suse-linux-gnu) libcurl/7.66.0 OpenSSL/1.1.1d-fips zlib/1.2.11 libidn2/2.2.0 libpsl/0.20.1 (+libidn2/2.2.0) libssh/0.8.7/openssl/zlib nghttp2/1.40.0
Release-Date: 2019-09-11
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz Metalink NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets

Downloading files with curl

The command syntax is:

curl url --output filename
curl https://url -o

Let us try to download a file from and save it as output.pdf

curl -o output.pdf


curl --output output.pdf
Download a file with curl command

The -o or --output option allows you to give the downloaded file a different name. If you do not provide the output file name curl will display it to the screen. Let us say you type:

curl --output file.html

We will see progress meter as follows:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 41280    0 41280    0     0  64803      0 --:--:-- --:--:-- --:--:-- 64702

The outputs indicates useful information such as:

  • % Total : Total size of the whole expected transfer (if known)
  • % Received : Currently downloaded number of bytes
  • % Xferd : Currently uploaded number of bytes
  • Average Dload : Average transfer speed of the entire download so far, in number of bytes per second
  • Speed Upload : Average transfer speed of the entire upload so far, in number of bytes per second
  • Time Total : Expected time to complete the operation, in HH:MM:SS notation for hours, minutes and seconds
  • Time Spent : Time passed since the start of the transfer, in HH:MM:SS notation for hours, minutes and seconds
  • Time Left : Expected time left to completion, in HH:MM:SS notation for hours, minutes and seconds
  • Current Speed : Average transfer speed over the last 5 seconds (the first 5 seconds of a transfer is based on less time, of course) in number of bytes per second

Resuming interrupted downloads with curl

Pass the -C - to tell curl to automatically find out where/how to resume the transfer. It then uses the given output/input files to figure that out:
## Restarting an interrupted download is important task too ##
curl -C - --output bigfilename https://url/file

How to get a single file without giving output name

You can save output file as it is i.e. write output to a local file named like the remote file we get. For example, sticker_book.pdf is a file name for remote URL One can save it sticker_book.pdf directly without specifying the -o or --output option by passing the -O (capital
curl -O
Downloading files with curl

Downloading files with curl in a single shot

Dealing with HTTP 301 redirected file

The remote HTTP server might send a different location status code when downloading files. For example, HTTP URLs are often redirected to HTTPS URLs with HTTP/301 status code. Just pass the -L follow the 301 (3xx) redirects and get the final file on your system:
curl -L -O

Downloading multiple files or URLs using curl

curl -O url1 -O url2
curl -O \

One can use the bash for loop too:

## define a bash shell variable ##
## let us grab it ##
for u in $urls
   curl -O "$u"

How to download a file using curl and bash for loop

How to download a file using curl and bash for loopAnother option is to create a file named urls.txt as follows and then run the xargs command:

Finally type:
xargs -n 1 curl -O < "urls.txt"
ls -l

Grab a password protected file with curl

Try any one of the following syntax
curl --ftp-ssl -u UserName:PassWord
curl -u Username:Password

Downloading file using a proxy server

Again syntax is as follows:
curl -x proxy-server-ip:PORT -O url
curl -x 'http://vivek:YourPasswordHere@' -v -O

How to use curl command with proxy username/password


curl command can provide useful information, especially HTTP headers. Hence, one can use such information for debugging server issues. Let us see some examples of curl commands. Pass the -v for viewing the complete request send and response received from the web server.
curl -v url
curl -o output.pdf -v

Getting HTTP headers information without downloading files

Another useful option is to fetch HTTP headers. All HTTP-servers feature the command HEAD which this uses to get nothing but the header of a document. For instance, when you want to view the HTTP response headers only without downloading the data or actual files:
curl -I url
curl -I -o output.pdf

Download a file with curl

Getting header information for given URL

How do I skip SSL skip when using curl?

If the remote server has a self-signed certificate you may want to skip the SSL checks. Therefore, pass pass the -k option as follows:
curl -k url
curl -k

Rate limiting download/upload speed

You can specify the maximum transfer rate you want the curl to use for both downloads and uploads files. This feature is handy if you have a limited Internet bandwidth and you would like your transfer not to use your entire bandwidth. The given speed is measured in bytes/second, unless a suffix is appended. Appending ‘k’ or ‘K’ will count the number as kilobytes, ‘m’ or ‘M’ makes it megabytes, while ‘g’ or ‘G’ makes it gigabytes. For Examples: 200K, 3m and 1G:
curl --limit-rate {speed} url
curl --limit-rate 200
curl --limit-rate 3m

Setting up user agent

Some web application firewall will block the default curl user agent while downloading files. To avoid such problems pass the -A option that allows you to set the user agent.
curl -A 'user agent name' url
curl -A 'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0'

Upload files with CURL

The syntax is as follows to upload files:
curl -F "var=@path/to/local/file.pdf" https://url/upload.php
For example, you can upload a file at ~/Pictures/test.png to the server which processes file input with form parameter named img_file, run:
curl -F "img_file=@~/Pictures/test.png"
One can upload multiple files as follows:
curl -F "img_file1=@~/Pictures/test-1.png" \
-F "img_file2=@~/Pictures/test-2.png" \

Make curl silent

Want to make hide progress meter or error messages? Try passing the -s or --slient option to turn on curl quiet mode:
curl -s url
curl --silent --output filename https://url/foo.tar.gz


Like most Linux or Unix CLI utilities, you can learn much more about curl command by visiting this help page.

Similar Posts