目录
我是一个macOS Unix新用户,正在编写一个小的bash shell脚本。那么我应该如何使用curl通过命令行界面直接下载文件呢?如何在Linux或类Unix系统上使用cURL下载文件?
简介:cURL既是一个命令行工具也是一个静态链接库。人们可以使用它来下载或传输数据/文件,curl支持多种协议,例如HTTP、HTTPS、FTP、SFTP等。curl命令行工具允许用户通过bash shell获取指定的URL或文件。本文将介绍如何在Linux、macOS、*BSD和类Unix操作系统上使用curl命令下载文件。
如何使用curl命令下载文件
基础语法:
- 使用curl抓取文件:curl https://your-domain/file.pdf
- 使用ftp或sftp协议获取文件:curl ftp://ftp-your-domain-name/file.tar.gzcurl ftp://ftp-your-domain-name/file.tar.gz
- 用户使用curl下载文件时可以设置指定文件名,执行如下命令即可:curl -o file.pdf https://your-domain-name/long-file-name.pdf
- 使用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下载文件