最新消息:天气越来越冷,记得加一件厚衣裳

Linux/Unix命令行使用curl下载文件

Linux w3sun 1060浏览 0评论

我是一个macOS Unix新用户,正在编写一个小的bash shell脚本。那么我应该如何使用curl通过命令行界面直接下载文件呢?如何在Linux或类Unix系统上使用cURL下载文件?

简介:cURL既是一个命令行工具也是一个静态链接库。人们可以使用它来下载或传输数据/文件,curl支持多种协议,例如HTTP、HTTPS、FTP、SFTP等。curl命令行工具允许用户通过bash shell获取指定的URL或文件。本文将介绍如何在Linux、macOS、*BSD和类Unix操作系统上使用curl命令下载文件。

如何使用curl命令下载文件

基础语法:

  1. 使用curl抓取文件:curl https://your-domain/file.pdf
  2. 使用ftp或sftp协议获取文件:curl ftp://ftp-your-domain-name/file.tar.gzcurl ftp://ftp-your-domain-name/file.tar.gz
  3. 用户使用curl下载文件时可以设置指定文件名,执行如下命令即可:curl -o file.pdf https://your-domain-name/long-file-name.pdf
  4. 使用curl下载文件时还可以支持301重定向,执行如下命令即可:curl -L -o file.tgz http://www.cyberciti.biz/long.file.name.tgz

接下来让我们看看在Linux或类Unix系统上使用curl进行下载和上传文件的一些例子和用法。

Linux或Unix上安装curl

## Debian/Ubuntu Linux通过apt/apt-get命令安装 ##
$ sudo apt install curl
## Fedora/CentOS/RHEL用户可以尝试通过dnf/yum命令安装 ##
$ sudo dnf install curl
## OpenSUSE Linux用户可以尝试通过zypper命令安装 ##
$ sudo zypper install curl

通过显示curl版本号验证安装是否成功

输入命令:

$ curl --version

我们可以看到如下信息:

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

使用curl下载文件

命令行语法:

curl url --output filename
curl https://url -o output.file.name

让我们尝试从https://www.cyberciti.biz/files/sticker/sticker_book.pdf下载一个文件并将其保存为output.pdf

curl https://www.cyberciti.biz/files/sticker/sticker_book.pdf -o output.pdf

或者执行如下命令亦可:

curl https://www.cyberciti.biz/files/sticker/sticker_book.pdf --output output.pdf

-o或–output选项允许用户为下载的文件指定一个不同的名称。如果用户没有指定输出文件名,curl默认会将其显示在终端上。假设用户输入:

curl --output file.html https://www.cyberciti.biz

那么将会看到如下进度表:

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

输出显示了一些有用的信息,例如:

  • % Total : 预计传输的总大小
  • % Received : 已下载字节数
  • % Xferd : 已上传字节数
  • Average Dload : 整个下载的平均速度,单位为byte/s
  • Speed Upload : 整个上传的平均速度,单位为byte/s
  • Time Total : 预期完成操作所需要的剩余时间,HH:MM:ss表示小时、分钟和秒
  • Time Spent : 从传输开始到现在的时间,HH:MM:ss表示小时、分钟和秒
  • Time Left : 预期完成操作所需要的剩余时间,HH:MM:ss表示小时、分钟和秒
  • Current Speed : 过去 5 秒的平均传输速度(当然,传输的前5秒基于较少的时间进行计算),单位为byte/s

使用curl恢复中断的下载

curl通过-C – 选项可以自动找出恢复传输的位置/方法。然后它将使用给定的输出/输入文件来计算传输中断的位置。

## 重新启动中断的下载也是一项重要任务 ##
curl -C - --output bigfilename https://url/file

如何在不指定输出名称的情况下获得单个文件

用户可以按原样保存输出文件,即把输出写入一个本地文件其名称与我们想要获取的远程文件一样。例如,sticker_book.pdf是远程文件https://www.cyberciti.biz/files/sticker/sticker_book.pdf的文件名。用户可以通过-O(大写)直接保存sticker_book.pdf,而不需要通过-o或–output选项指定文件名。

curl -O https://www.cyberciti.biz/files/sticker/sticker_book.pdf

处理HTTP 301重定向文件

下载文件时,远程HTTP服务器可能会发送不同的状态代码。例如,HTTP URLs经常被重定向到携带有HTTP/301状态代码的HTTPS URLs。只要通过-L选项跟随301(3xx)重定向,就可以将最终的文件下载到用户的系统上。

curl -L -O http://www.cyberciti.biz/files/sticker/sticker_book.pdf

使用curl下载多个文件或URL

可以尝试如下命令:

curl -O url1 -O url2

curl -O https://www.cyberciti.biz/files/adduser.txt \
     -O https://www.cyberciti.biz/files/test-lwp.pl.txt

用户也可以使用bash for循环

## 定义一个shell变量 ##
urls="https://www.cyberciti.biz/files/adduser.txt https://www.cyberciti.biz/files/test-lwp.pl.txt"
 
## let us grab it ##
for u in $urls
do
   curl -O "$u"
done

循环下载文件的另一种方式是创建一个名为urls.txt的文件,如下所示,然后运行xargs命令:

url1
url2
url3

最后输入如下命令:

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

通过curl获取一个受密码保护的文件

用户可以尝试以下任何一种语法:

curl ftp://username:passwd@ftp1.cyberciti.biz:21/path/to/backup.tar.gz
curl --ftp-ssl -u UserName:PassWord ftp://ftp1.cyberciti.biz:21/backups/07/07/2012/mysql.blog.sql.tar.gz
curl https://username:passwd@server1.cyberciti.biz/file/path/data.tar.gz
curl -u Username:Password https://server1.cyberciti.biz/file/path/data.tar.gz

使用代理服务器下载文件

同样语法如下:

curl -x proxy-server-ip:PORT -O url
curl -x 'http://vivek:YourPasswordHere@10.12.249.194:3128' -v -O https://dl.cyberciti.biz/pdfdownloads/b8bf71be9da19d3feeee27a0a6960cb3/569b7f08/cms/631.pdf

curl命令更多示例

curl命令可以提供一些有用的信息,特别是HTTP头信息。因此,用户可以利用这些信息来调试服务器问题。让我们来看一些curl命令的示例。通过-v选项可以来查看完整的请求和从Web服务器收到的响应。

curl -v url
curl -o output.pdf -v https://www.cyberciti.biz/files/sticker/sticker_book.pdf

不下载文件情况下获取HTTP头信息

另一个有用的选项是获取HTTP头。所有的HTTP服务器都有HEAD命令,用它来获取一个文件的头。例如,当你想只查看HTTP响应头而不下载数据或实际文件时可以使用如下命令:

curl -I url
curl -I https://www.cyberciti.biz/files/sticker/sticker_book.pdf -o output.pdf

使用curl时如何跳过SSL检查

如果远程服务器有自签名证书,而且用户可能希望跳过SSL检查。可以按如下方式通过-k选项实现:

curl -k url
curl -k https://www.cyberciti.biz/

下载/上传速度限速

用户可以指定希望curl用于下载和上传文件的最大传输速率。如果用户的Internet带宽有限并且希望传输过程不占用全部带宽,则此功能非常方便。除非附加了后缀,否则给定的速度默认是以字节/秒为单位的。附加“k”或“K”将以千字节为单位,“m”或“M”为兆字节,而“g”或“G”为千兆字节。例如:200K、3m 和 1G:

curl --limit-rate {speed} url
curl --limit-rate 200 https://www.cyberciti.biz/
curl --limit-rate 3m https://www.cyberciti.biz/

curl设置用户代理

某些web应用程序防火墙会在下载文件时阻止默认的curl用户代理。为避免此类问题,可以使用-A选项来设置用户代理。

curl -A 'user agent name' url
curl -A 'Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0' https://google.com/

使用curl上传文件

上传文件的语法如下:

curl -F "var=@path/to/local/file.pdf" https://url/upload.php

例如,您可以将~/Pictures/test.png文件上传到服务器https://127.0.0.1/app/upload.php,该服务器使用名为img_file的表单参数处理文件输入,运行如下命令即可:

curl -F "img_file=@~/Pictures/test.png" https://127.0.0.1/app/upload.php

curl也支持同时上传多个文件,命令如下所示:

curl -F "img_file1=@~/Pictures/test-1.png" \
-F "img_file2=@~/Pictures/test-2.png" \
https://127.0.0.1/app/upload-multi.php

开启curl静默模式

想要隐藏进度表或错误消息?可以尝试通过-s或–silent选项打开curl的静默模式:

curl -s url
curl --silent --output filename https://url/foo.tar.gz

全文总结

与大多数Linux或Unix CLI实用程序一样,用户可以通过访问此帮助页面了解有关curl命令的更多信息。

参考资料

本文翻译自Vivek Gite博文,详情信息如下:

作者:Vivek Gite

原文地址:https://www.cyberciti.biz/faq/download-a-file-with-curl-on-linux-unix-command-line/

转载请注明:雪后西塘 » Linux/Unix命令行使用curl下载文件

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址