Linux命令比较:Curl与wget
1.概述
我们可能希望在不使用网络浏览器或其他互动应用程序的情况下发送HTTP请求。为此,Linux为我们提供了两个命令。curl和wget。
这两个命令都很有帮助,因为它们提供了一个非交互式下载和上传数据的机制。我们可以将它们用于网络抓取、自动化脚本、测试API等。
在本教程中,我们将研究这两种工具之间的区别。
2.协议
2.1.使用HTTP协议
curl和wget都支持HTTP、HTTPS和FTP协议。因此,如果我们想从一个网站获得一个页面,比如baeldung.com,那么我们可以用网址作为参数运行它们。
wget https://www.baeldung.com/
--2019-10-02 22:00:34-- https://www.baeldung.com/
Resolving www.baeldung.com (www.baeldung.com)... 2606:4700:30::6812:3e4e, 2606:4700:30::6812:3f4e, 104.18.63.78, ...
Connecting to www.baeldung.com (www.baeldung.com)|2606:4700:30::6812:3e4e|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’
index.html [ <=> ] 122.29K --.-KB/s in 0.08s
2019-10-02 22:00:35 (1.47 MB/s) - ‘index.html’ saved [125223]
它们之间的主要区别是:curl 会在控制台显示输出。另一方面,wget会将其下载到一个文件中。
我们可以通过curl使用-o参数,将数据保存在一个文件中。
curl https://www.baeldung.com/ -o baeldung.txt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 122k 0 122k 0 0 99k 0 --:--:-- 0:00:01 --:--:-- 99k
2.2.使用FTP下载和上传
我们还可以使用curl和wget来下载使用FTP协议的文件。
wget --user=abhi --password='myPassword' ftp://abc.com/hello.pdf
curl -u abhi:myPassword 'ftp://abc.com/hello.pdf' -o hello.pdf
我们也可以用curl上传文件到FTP服务器。为此,我们可以使用-T参数。
curl -T "img.png" ftp://ftp.example.com/upload/
我们应该注意,当上传至一个目录时,我们必须使用提供尾部的/,否则curl会认为该路径代表一个文件。
2.3.差异
两者之间的区别是, curl支持大量的其他协议。这包括DICT, FILE, FTPS, GOPHER, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET和TFTP。
我们可以把curl当作一个通用的工具,用于向服务器传输数据或从服务器中传输数据。
另一方面,wget基本上是一个网络下载器。
3.递归下载
当我们希望对一个网站进行本地拷贝时,wget是可以使用的工具。curl 不提供递归下载,因为不能为其支持的所有协议提供递归下载。
我们可以用wget下载一个网站,只需一条命令。
wget --recursive https://www.baeldung.com
这将下载主页和从中链接的任何资源。正如我们所看到的,www.baeldung.com链接到其他各种资源,如。
- 从这里开始
- 使用Spring的REST课程
- 学习Spring安全课程
- 学习spring的课程
wget将跟踪这些资源中的每一个,并单独下载它们。
--2019-10-02 22:09:17-- https://www.baeldung.com/start-here
...
Saving to: ‘www.baeldung.com/start-here’
www.baeldung.com/start-here [ <=> ] 134.85K 321KB/s in 0.4s
2019-10-02 22:09:18 (321 KB/s) - ‘www.baeldung.com/start-here’ saved [138087]
--2019-10-02 22:09:18-- https://www.baeldung.com/rest-with-spring-course
...
Saving to: ‘www.baeldung.com/rest-with-spring-course’
www.baeldung.com/rest-with-spring-cou [ <=> ] 244.77K 395KB/s in 0.6s
2019-10-02 22:09:19 (395 KB/s) - ‘www.baeldung.com/rest-with-spring-course’ saved [250646]
... more output omitted
3.1.使用HTTP的递归下载
递归下载是wget的最强大功能之一。这意味着wget可以跟踪HTML、XHTML和CSS页面中的链接,创建远程网站的本地版本,完全重新创建原始网站的目录结构。
在wget中的递归下载是breadth-first.换句话说,它首先下载请求的文档,然后是该文档的链接文档,然后是这些文档的链接文档,以此类推。默认的最大深度被设置为5,但可以用-l参数来覆盖它。
wget ‐l=1 ‐‐recursive ‐‐no-parent http://example.com
在HTTP或HTTPS网址的情况下,wget扫描并解析HTML或CSS。然后,它通过href或src等标记,检索该文件所指的文件。
默认情况下,wget将排除robots.txt下的路径(Robot Exclusion Standard)。要关闭这个功能,我们可以使用e参数。
wget -e robots=off http://example.com
3.2.用FTP进行递归下载
与HTTP递归不同,FTP递归是以深度为先。这意味着wget将检索第一个目录的数据,直到指定的深度级别,然后移动到目录树中的下一个目录。
4.总结
在这篇文章中,我们看到了curl 和wget是如何从互联网服务器下载文件的。
wget是一个比较简单的解决方案,只支持少量的协议。它非常适用于下载文件,并且可以递归地下载目录结构。
我们也看到了curl如何支持更大范围的协议,使其成为一个更通用的工具。