Linux wget和curl进阶
wget
wget是一个流行的、免费的、非交互式的命令行工具,主要用于从网络上下载文件。支持通过HTTP、HTTPS和FTP协议下载,并且它是递归下载的,这意味着它可以镜像网站或获取完整的FTP目录结构。
下载单个文件
使用wget时,只指定了url地址,表示从网络中下载单个文件到当前目录,这是wget最基础的用法。
如果没有指定下载的文件名是什么,默认会使用URL的最后一部分作为默认的文件名,如果知道下载的这个文件叫什么名字,可以用 -O(大写)参数来指定下载的文件名。
使用wget下载文件时,它会默认在屏幕上显示下载的进度和其他相关消息,可以使用 -o(小写) 参数并指定一个文件名,那么这些输出消息会被重定向到该文件,而不是显示在屏幕上。
wget的 -O和 -o的区别:
-
-o:将输出到屏幕上的日志信息保存在一个文件中
-
-O:指定下载文件的文件名
wget -O file_name url_path
说明:
- wget支持断点续传功能,如果一个大文件的下载被中断,你可以使用 wget 的 -c 参数来 继续从中断点开始下载
例如:
# 将文件保存为名为 CentOS-Base.repo 的文件。即使原始文件的名称是不同的,它仍将被保存为 CentOS-Base.repo。
wget -O CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.rep
# 下载的文件会被保存为原始文件的名称 CentOS-Base.repo这个文件只会包含该下载过程中生成的所有日志信息
wget -o CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
检查http/https连通性
使用wget检查URL的连通性时,实际上是在进行两个层面的检查
-
传输层(TCP): 首先检查是否可以建立到指定IP和端口的TCP连接。这实质上是检查传输层的连通性。
-
应用层(HTTP/HTTPS): 一旦TCP连接建立,wget会发送HTTP请求(例如HEAD请求,当使用--spider选项时)到服务器,并等待响应。服务器的响应告诉你是否该URL在应用层上是可访问
检查http/https连通性的时候,通过 --spider 选项告诉 wget 不要下载任何内容,使用 -S 参数 来查看服务器响应头。这样就可以通过响应头来检查http的连通性了。
如果检查某个http/https的url连通性时,需要指定端口的话,只需在URL中添加:[端口号]就行了
wget --spider -S url_path
wget --spider -S http://www.example.com:5000/
例如: 检查这个url的连通性
wget --spider -S http://www.forthink.xyz:5000/sharing/OmbrfIbc4
例如: 检查指定url的连通性,并指定端口号
wget --sipder -S http://192.168.0.104:80
curl
url 是一个命令行工具,用于从服务器或到服务器传输数据。这个工具非常强大,支持各种协议,包括 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、LDAP、DAP等。在Web开发中,curl 主要用于进行HTTP请求。
这里我们主要介绍curl和http/https的交互
显示url内容
如果使用curl命令的时候,后面只提供了一个url地址,那么默认curl执行的是 HTTP 的 GET 请求
curl http://example.com
指定指定请求
默认执行的是http的GET请求,但是通过 —X(大写)参数。可以指定curl发起的请求类型。
-
-X POST : 发起POST请求
-
—X PUT : 发起PUT请求
例如:
curl -X POST http://192.168.0.102
说明:当指定curl指定POST请求时,如果要给服务器传递参数,可以使用 -d 或者 --data来实现。可以指定多个参数
curl -X PSOT -d "key=value" -d "key=vale" url_path
例如:
curl -X POST -d "username=admin" -d "password=c93ccd78b2076528346216b3b2f701e6" -d "http_api_version=4.27" http://192.168.13.255/EHCommon/admin/user/login
如果是传递json数据的话,还需要使用 -H 来指定请求头的信息,指定 Content-Type 为 application/json
curl -X POST -H "Content-Type: application/json" -d '{"key1":"value1", "key2":"value2"}' url_path
显示请求头信息
如果想要显示http/https的请求头信息,可以使用 -i(小写) 参数来实现,但是通过也会把url中的内容给显示出来,如果只想要显示请求头信息,通过 -I(大写)参数指定即可。
使用 curl 或 wget 等工具并且没有指定协议时,它们默认使用的是 HTTP 协议
curl -I 192.168.0.102
下载单个文件
curl可以和wget一样下载单个文件,通过 -o(小写)和 -O(大写)来指定文件名进行下载。
-
-o:需要指定下载文件的文件名
-
-O: 会根据远程文件的URL来确定本地保存的文件名
curl -O http://example.com/index.html
curl -o http://example.com/index.html
例如:
忽略证书验证
使用curl的 -k 参数可以在访问https的时候,忽略证书的验证。
因为使用curl命令访问一个使用SSL/TLS加密的网站(例如:https网址)时,curl默认会尝试验证服务器的SSL证书。如果服务器使用一个自签名证书,或者使用的证书由一个不被curl默认信任的证书颁发机构(CA)颁发。在这种情况下,curl会拒绝建立连接,并给出一个SSL证书错误。使用了 -k或者--insecure 参数后,即使证书是自签名的,或者不是由受信任的CA签发的,curl也会与服务器建立连接。
例如:
静默模式输出
默认情况下,使用curl的时候,会显示进度信息或错误消息,如果不希望命令的标准输出中混入不必要的进度或其他消息。使用 -s 参数即可隐藏这些信息的显示。
例如:
输出指定信息
如果只想要输出指定的信息部分,使用 -w 参数可以实现。
格式:
curl -w "格式化字符串" url_path
# curl提供的各种内置变量
%{http_code}: 显示HTTP响应代码。
%{time_total}: 显示请求总时间。
%{url_effective}: 显示实际请求的URL,特别是在重定向时很有用。
%{content_type}: 响应中的Content-Type(Content-Type指示资源的媒体类型(或称为 MIME 类型)。这告诉接收端(通常是浏览器)该如何解释或显示这个资源。)
%{time_namelookup}: DNS解析域名所需的时间。
方法一:
通过 -I 参数显示http的请求头,然后结合grep和awk取得请求信息。
curl -I http://192.168.0.102/index.php 2>&1 | grep HTTP | awk '{print $2}'
方法二:
通过 -w参数结合curl的内置变量输出http的请求状态信息。
curl -s -o /dev/null -w "%{http_code}" http://192.168.0.102/index.php
-o 参数是下载文件的文件名,也就是将curl原本输出到屏幕的内容重定向到一个文件里面。这里指定为/dev/null,则url的信息不会显示到屏幕上,只显示 -w 指定的内置变量对应的值。