本教程深入探讨使用以下命令下载文件的方法卷曲命令.
我们将介绍 HTTP 下载、安全 HTTPS 传输、使用 FTP 服务器的基础知识,甚至浏览分段下载和速度调整等高级功能。
下载到标准输出
如果您使用不带任何标志的curl命令,它会将下载内容直接发送到标准输出。
curl http://example.com/sample.txt
该命令将显示以下内容sample.txt
直接在您的终端中。
您可以利用 Unix 管道的强大功能立即处理数据。例如,要在文件中搜索特定术语而不下载它:
curl http://example.com/sample.txt | grep "search_term"
下载并保存到文件
当您想要从使用 HTTP 协议的网站下载文件时,curl 命令使这一切变得简单。下面的简单结构允许您将文件直接获取到您的计算机。
curl -O http://example.com/sample.zip
该命令获取文件sample.zip
from http://example.com
并将其保存在当前目录中。这-O
flag 指示curl 使用其原始名称保存文件。
验证/绕过 SSL 证书
如果您想确保服务器的证书有效或在确定来源时选择绕过验证。
使用 –cacert
curl --cacert /path/to/cacert.pem -O https://secure-example.com/file.zip
此命令从安全的 HTTPS 站点获取文件,同时确保根据给定的证书文件验证服务器的证书/path/to/cacert.pem
.
使用--不安全
curl --insecure -O https://secure-example.com/file.zip
通过使用--insecure
标志,curl 绕过证书验证过程。
尽管这在内部网络等特定情况下很有用,但它存在潜在风险,应谨慎使用。
从 FTP 服务器下载
要从 FTP 服务器下载文件,请使用:
curl -O ftp://ftp.example.com/path/to/file.zip
如果 FTP 服务器需要用户名和密码,请在 URL 中提供或使用-u
flag:
curl -O ftp://username:password@ftp.example.com/path/to/file.zip
Or:
curl -u username:password -O ftp://ftp.example.com/path/to/file.zip
FTP 以两种模式运行:主动模式和被动模式。默认情况下,curl
使用被动模式。如果您需要强制执行活动模式,请使用--ftp-port
option:
curl --ftp-port - -O ftp://ftp.example.com/path/to/file.zip
在这种情况下,后面的“-”--ftp-port
tells curl
选择适当的本地端口号。
确定文件大小
出于多种原因,在下载之前确定文件的大小至关重要:为了确保足够的磁盘空间、执行分段下载,或者只是为了了解下载持续时间。
您可以使用-I
标志发送头请求以仅获取标头而不下载文件。
curl -I http://example.com/largefile.zip | grep Content-Length
在回应中,Content-Length
header 指示文件的大小(以字节为单位)。
范围和部分下载
您可以使用-r
or --range
下载文件的特定部分:
curl -O http://example.com/sample.mp3 -r 10000-50000
The -r
flag 允许您指定字节范围,确保仅下载文件的该部分。
在此示例中,字节 10,000 到 50,000sample.mp3
文件已获取。
分段下载
也称为多连接或多部分下载,涉及将文件拆分为多个部分并分别下载这些部分。
While curl
本身不支持分段下载,您仍然可以使用手动实现curl
稍加努力。
首先,您需要知道文件的总大小(以字节为单位)。使用curl
与-I
标记为仅获取标头,就像我们上面所做的那样:
curl -I http://example.com/largefile.zip | grep Content-Length
然后将文件分成段:
假设文件大小为3000字节,您想分3段下载。您的细分将是:
- 0-999字节
- 1000-1999字节
- 2000-2999字节
接下来,使用下载每个片段-r
or --range
:
curl -r 0-999 -o segment1 http://example.com/largefile.zip
curl -r 1000-1999 -o segment2 http://example.com/largefile.zip
curl -r 2000-2999 -o segment3 http://example.com/largefile.zip
下载后,您可以组合这些片段来重建原始文件:
cat segment1 segment2 segment3 > combinedfile.zip
顺序下载多个文件
当您要从服务器下载多个文件时,curl 可以通过单个命令处理所有文件,从而使该过程高效且有组织。
curl -O http://example.com/file1.zip -O http://example.com/file2.zip
通过链接-O
标志后跟 URL,您指示curl 将这些文件中的每一个下载到当前目录。
如果文件中存储了多个 URL,则可以使用以下命令下载所有 URL:
xargs -n 1 curl -O < urls.txt
Here, urls.txt
每行应该有一个 URL。
连续下载文件会花费很多时间,因为文件是一个接一个下载的。
为了加快速度,curl 可以使用并行下载文件--parallel
flag.
同时下载多个文件
您可以使用--parallel
同时下载多个 URL 的标志:
curl --parallel -O http://example.com/file1.zip -O http://example.com/file2.zip
在这里,两者file1.zip
and file2.zip
将同时下载。
这可以显着加快传输过程,特别是在处理多个小文件或服务器限制每个连接的速度时。
默认情况下,curl
将尝试并行下载最多 50 个 URL。但是,如果您想调整它以适合您的带宽或服务器的功能。来了parallel-max
flag.
Note:确保您的版本curl
支持--parallel
选项因为--parallel
版本 7.66.0 中的选项。
设置最大同时传输数
如果您同时处理大量下载,您可以设置限制以避免潜在的网络或资源限制。
curl --parallel --parallel-max 3 -O http://example.com/file1.zip -O http://example.com/file2.zip -O http://example.com/file3.zip
使用--parallel-max
flag后面跟一个数字,可以限制最大同时传输数。在此示例中,curl 将其限制为 3。
恢复中断的下载
如果您的下载因任何原因损坏或中断,您无需重新开始。您可以从上次中断的地方继续。
curl -C - -O http://example.com/largefile.zip
The -C -
标志通知curl从中断处继续下载,以防中断。
这对于不可靠的网络连接特别有用。
手动指定恢复点
如果知道下载中断的字节数。您可以使用以下命令手动指定-C
option:
curl -C 50000 -O http://example.com/largefile.zip
在此示例中,下载将从字节 50000 开始恢复。
完成中断的下载后,始终确保文件完整性。许多网站在下载链接旁边提供 MD5、SHA-1 或 SHA-256 哈希值。
您可以使用类似的工具md5sum
, sha1sum
, or sha256sum
根据提供的哈希值验证下载文件的完整性。
Note:如果服务器不支持字节范围或部分请求,请使用-C
选项不会产生任何影响,下载将从头开始。
在背景下载
开始一个curl
在后台下载,您可以使用&
命令末尾的符号:
curl -O http://example.com/largefile.zip &
这将启动下载,但立即将控制权返回给终端。
要检查后台作业的状态,请使用jobs
命令。
这将显示与您的终端会话关联的所有当前后台任务。
如果您需要将下载返回到前台,也许是为了详细检查其进度或优雅地停止它,请使用fg
命令。
跑步时curl
在后台,重定向其输出是一个好习惯,特别是当您期待错误消息时。
curl -O http://example.com/largefile.zip > download.log 2>&1 &
在这里,标准输出和错误消息都被重定向到download.log
.
如果您想继续下载并关闭终端,请使用nohup
确保下载继续:
nohup curl -O http://example.com/largefile.zip &
The nohup
命令确保curl
即使终端关闭后操作仍会继续。
设置下载速度限制
为了避免占用网络资源,您应该限制下载速度。
curl --limit-rate 200K -O http://example.com/largefile.zip
The --limit-rate
标志后跟速度(例如,200K
每秒 200 KB)设置下载速度限制。
The --limit-rate
选项支持各种速度单位:
-
K
or k
千字节。
-
M
or m
兆字节
-
G
or g
千兆字节
- 您也可以仅指定以字节为单位的速率,而无需任何单位。
curl --limit-rate 1M -O http://example.com/largefile.zip
这将下载速度限制为每秒 1 兆字节。
处理缓慢/停滞的下载
如果下载速度在指定持续时间内下降到某个阈值以下,您可能需要中止传输。这对于检测停滞的连接很有用。
我们有两个标志可以让我们控制这个:
--speed-limit <rate>
:这设置了传输速度(以每秒字节数为单位),传输应在指定时间内高于该速度才能继续传输。
--speed-time <seconds>
:设置时间,以秒为单位,传输速度应低于指定的速度--speed-limit
传输被认为太慢并因此中止。
curl --speed-time 30 --speed-limit 1000 -O http://example.com/largefile.zip
在此示例中,如果下载速率低于 1000 字节/秒达 30 秒,curl 将停止下载。
出错时重试
网络问题或服务器错误有时会中断下载。可以将curl设置为自动重试,而不是手动重新启动下载。
curl --retry 5 --retry-max-time 120 --retry-delay 10 --retry-all-errors -O http://example.com/file.zip
Here:
-
--retry 5
指示curl重试最多5次。
-
--retry-max-time 120
设置卷曲重试应花费的总时间(以秒为单位)。
-
--retry-delay 10
设置重试之间的延迟为 10 秒。
-
--retry-all-errors
使curl 重试所有错误,而不仅仅是暂时性错误。
处理下载过程中 VPN 断开连接
使用 VPN 连接时,临时断开连接可能会中断您的下载。虽然curl不直接处理VPN重新连接,但使用重试选项可以在这种情况下提供帮助。
curl --retry 5 --retry-max-time 120 -O http://example.com/file.zip
重试标志使curl能够应对较小的连接问题,让您的VPN有机会重新连接并恢复操作。
从受密码保护的 URL 下载文件
为了避免在命令行历史记录或脚本中暴露密码,您可以使用curl
以提示您输入密码的方式:
curl -u username --prompt -O http://example.com/protectedfile.zip
Here, curl
会要求您以交互方式输入密码。
如果您经常访问受密码保护的资源,则重复输入凭据可能会很麻烦。这.netrc
文件是存储这些的一种方式。创建一个.netrc
您的主目录中的文件:
touch ~/.netrc
按以下格式添加凭据:
machine example.com
login username
password yourpassword
然后,使用curl
没有指定-u
option:
curl --netrc -O http://example.com/protectedfile.zip
Note:始终确保您的.netrc
文件权限设置为 600 (chmod 600 ~/.netrc
)以防止未经授权的访问。
Note:始终确保通过安全通道(最好是 HTTPS)传输敏感凭据。
使用代理
下载文件时使用代理curl
,您可以使用-x
or --proxy
option:
curl -x http://proxyserver:port -O http://example.com/file.zip
如果代理需要身份验证,您可以使用提供凭据-U
or --proxy-user
option:
curl -x http://proxyserver:port -U username:password -O http://example.com/file.zip
curl
支持HTTP、HTTPS、SOCKS4、SOCKS5等多种代理协议。要指定代理协议,请将其包含在代理字符串中:
curl -x socks5://proxyserver:port -O http://example.com/file.zip
如果您经常使用同一个代理,则可以设置环境变量。对于 HTTP 代理,您可以设置:
export http_proxy=http://proxyserver:port
curl
将自动使用此代理来处理所有后续请求。记得还要设置https_proxy
.
显示下载进度条
下载过程中的视觉反馈有助于衡量进度。为此,Curl 可以提供进度条。
curl -# -O http://example.com/largefile.zip
The -#
flag 指示curl 显示进度条而不是默认统计信息。
Use the -s
or --silent
静音所有进度指示器的选项:
curl -s -O http://example.com/largefile.zip
如果您想要有关下载的详细信息而不是进度条,您可以将静默模式与详细模式结合起来:
curl -s -v -O http://example.com/largefile.zip
Note:使用详细模式时请务必小心,尤其是对于受密码保护的 URL。
详细模式将显示所有发送的标头,这将在控制台中暴露敏感数据。
根据修改时间下载文件
同步文件时,仅获取自特定日期以来已更改的文件非常有用。
The --time-cond
后跟日期的标志可确保仅在指定日期之后修改文件时才下载该文件。
curl -O http://example.com/file.zip --time-cond "2023-08-22"
为了实现自动化,请将本地文件的时间戳与远程文件进行比较:
curl --time-cond localfile.zip -O http://example.com/file.zip
在这种情况下,curl
检查“localfile.zip”的最后修改时间,如果是则仅下载远程文件newer.
要下载的文件older 比指定的日期,在日期前加上前缀-
:
curl -O http://example.com/file.zip --time-cond "-2023-08-22"
此命令仅在文件被修改时才获取该文件before 给定的日期和时间。
调整连接超时
为了更好地控制连接,您可以设置curl 在放弃建立连接之前应等待的时间。
curl --connect-timeout 10 -O http://example.com/file.zip
The --connect-timeout
flag 设置curl 尝试连接所花费的最长时间(以秒为单位)。
设置最大时间限制
While --connect-timeout
仅适用于连接阶段,--max-time
限制了整个操作的总时间。
为了防止下载时间过长,您可以设置时间上限。
curl --max-time 300 -O http://example.com/largefile.zip
Here, curl
如果整个操作(连接+下载)时间超过 300 秒,将会中止。
停止卷曲消毒
默认情况下,curl
将清理 URL。例如,如果你给curl
URL“http://example.com/../test/file.txt”,它将去掉“..”序列并从 URL 中请求“http://example.com/test/file.txt”服务器。
您可以使用--path-as-is
如果你想让curl请求一个URL而不清理或修改它。
curl --path-as-is -O http://example.com//directory/../file.zip
The --path-as-is
标志确保curl不会清理或改变提供的路径。
Note:避免 URL 清理可能会暴露潜在的安全问题,特别是当您与不受信任的服务器或站点交互时。
如果您是开发人员或安全研究人员并且想要测试您的服务器或应用程序如何响应未经净化的 URL,这非常有用。