Curl 与 Wget 命令使用及参数深入解析
一、curl 命令行工具及参数
- curl是一个开源的用于数据传输的命令行工具与库,它使用URL语法格式,支持众多传输协议,包括:HTTP、HTTPS、FTP、FTPS、GOPHER、TFTP、SCP、SFTP、SMB、TELNET、DICT、LDAP、LDAPS、FILE、IMAP、SMTP、POP3、RTSP和RTMP。curl库提供了很多强大的功能,你可以利用它来进行HTTP/HTTPS请求、上传/下载文件等,且支持Cookie、认证、代理、限速等。
1.curl的基本使用
- 1.使用curl访问一个网址(最基本用法)
在命令行中输入“curl 网址”即可在命令显示界面显示该网址的内容。这种使用方式通常用来检测一个网址是否能够正常访问,因为Linux服务器最小化安装里没有浏览器,因此这种方式就是实现一种浏览器访问的功能。 -
2.使用curl下载文件
在命令行中输入“curl -O 一个word网络地址 ”这句命令的意思是将该word下载到本地。在命令行中输入“curl -o 2.jpg 一个1.jpg网络地址”这句话是将1.jpg下载保存到本地,并可以重命名为2.jpg。 -
3.利用curl上传文件
在命令行中输入“curl -T 1.JPG -u 用户名:密码 ftp://FTP地址/img/”这句命令的意思是将1.jpg上传到一个ftp的目录下,当然了使用该句命令需要知道ftp的基本信息如端口用户名密码等。
2.curl命令的进阶
目录:
1. curl的使用
1.1 URL访问
1.2 表单提交
1.3 其它HTTP请求方法
1.4 文件上传
1.5 HTTPS支持
1.6 添加请求头
1.7 Cookie支持
2. curl语法及选项
----------------
1. curl的使用
1.1 URL访问
访问一个网页时,可以使用curl命令后加上要访问的网址:
curl itbilu.com
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.6.2</center>
</body>
</html>
如上所示,我们就看到所访问网址的页面源码。
重定向跟踪
在上面示例中,页面使用了301重定向,这时我们可以添加-L参数来跟踪URL重定向: curl -L itbilu.com
页面保存
如果需要将页面源码保存到本地,可以使用-o参数:
curl -o [文件名] itbilu.com
查看头信息
如果需要查看访问页面的可以添加-i或--include参数: curl -i itbilu.com
添加-i参数后,页面响应头会和页面源码(响应体)一块返回。如果只想查看响应头,可以使用-I或--head参数:
curl -I itbilu.com
HTTP/1.1 301 Moved Permanently
Server: nginx/1.6.2
Date: Sun, 25 Jun 2017 02:03:45 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: https://itbilu.com/
1.2 表单提交
通过Form表单,可以将Web页面的表单数据提交到服务端。提交表单时,可以使用GET或POST提交方法。
curl同样支持表单数据提交,也可以使用GET或POST提交方法。
GET数据提交
当全用GET表单数据提交时,提交数据会被附加到请求URL的后面。类型如下: curl '//itbilu.com/?keyword=linux&page=3'
使用curl进行GET数据提交时,也可以直接把提交数据添加到URL后面:
curl https://itbilu.com/?keyword=linux&page=3
POST数据提交
curl使用POST提交表单数据时,除了-X参数指定请求方法外,还要使用--data参数添加提交数据:
curl -X POST --data 'keyword=linux' itbilu.com
1.3 其它HTTP请求方法
目前为止,我们使用GET和POST两种HTTP请求。curl支持所有HTTP请求方法,只要通过-X参数指定即可。
如,使用DELETE请求: curl -X DELETE itbilu.com/examlple.html
使用PUT请求,并指定请求数据:
curl -X PUT --data 'keyword=linux' itbilu.com
1.4 文件上传
curl支持文件上传,上传文件时使用-T或--upload-file参数: curl -T ./index.html www.uploadhttp.com/receive.cgi
1.5 HTTPS支持
对于使用了SSL/TLS加密的HTTPS协议,可以使用curl直接访问:
curl https://itbilu.com
如果使用的本地ssl证书认证的HTTPS,可以通过-E或--cert参数指定本地证书: curl -E mycert.pem https:/itbilu.com
1.6 添加请求头
有时在进行HTTP请求时,需要自定义请求头。在curl中,可以通过-H或--header参数来指定请求头。多次使用-H或--header参数可指定多个请求头。
如,指定Content-Type及Authorization请求头:
curl -H 'Content-Type:application/json' -H 'Authorization: bearer eyJhbGciOiJIUzI1NiJ9' itbilu.com
1.7 Cookie支持
Cookie是一种常用的保持服务端会话信息的方法,crul也支持使用Cookie。
可以通过--cookie参数指定发送请求时的Cookie值,也可以通过-b [文件名]来指定一个存储了Cookie值的本地文件: curl -b stored_cookies_in_file itbilu.com
Cookie值可能会被服务器所返回的值所修改,并应用于下次HTTP请求。这时,可以能过-c参数指定存储服务器返回Cookie值的存储文件:
$ curl -b cookies.txt -c newcookies.txt itbilu.com
除以上用法外,curl还可以设置用户代理(客户端)信息、使用代理服务器、指定认证用户名/密码等。详见:curl语法及选项
curl --silent -H "Host: www.test.com" "192.168.0.1/xxx/xxx/t.php"
curl "http://www.test.com/LiveUserCount.ac " -x 127.0.0.1:1080
3. curl语法及选项
# curl语法结构如下:
===================
curl [options...] <url>
参数选项
curl(7.29.0)所支持的选项(options)参数如下:
在以下选项中,(H) 表示仅适用 HTTP/HTTPS ,(F) 表示仅适用于 FTP
--anyauth 选择 "any" 认证方法 (H)
-a, --append 添加要上传的文件 (F/SFTP)
--basic 使用HTTP基础认证(Basic Authentication)(H)
--cacert FILE CA 证书,用于每次请求认证 (SSL)
--capath DIR CA 证书目录 (SSL)
-E, --cert CERT[:PASSWD] 客户端证书文件及密码 (SSL)
--cert-type TYPE 证书文件类型 (DER/PEM/ENG) (SSL)
--ciphers LIST SSL 秘钥 (SSL)
--compressed 请求压缩 (使用 deflate 或 gzip)
-K, --config FILE 指定配置文件
--connect-timeout SECONDS 连接超时设置
-C, --continue-at OFFSET 断点续转
-b, --cookie STRING/FILE Cookies字符串或读取Cookies的文件位置 (H)
-c, --cookie-jar FILE 操作结束后,要写入 Cookies 的文件位置 (H)
--create-dirs 创建必要的本地目录层次结构
--crlf 在上传时将 LF 转写为 CRLF
--crlfile FILE 从指定的文件获得PEM格式CRL列表
-d, --data DATA HTTP POST 数据 (H)
--data-ascii DATA ASCII 编码 HTTP POST 数据 (H)
--data-binary DATA binary 编码 HTTP POST 数据 (H)
--data-urlencode DATA url 编码 HTTP POST 数据 (H)
--delegation STRING GSS-API 委托权限
--digest 使用数字身份验证 (H)
--disable-eprt 禁止使用 EPRT 或 LPRT (F)
--disable-epsv 禁止使用 EPSV (F)
-D, --dump-header FILE 将头信息写入指定的文件
--egd-file FILE 为随机数据设置EGD socket路径(SSL)
--engine ENGINGE 加密引擎 (SSL). "--engine list" 指定列表
-f, --fail 连接失败时不显示HTTP错误信息 (H)
-F, --form CONTENT 模拟 HTTP 表单数据提交(multipart POST) (H)
--form-string STRING 模拟 HTTP 表单数据提交 (H)
--ftp-account DATA 帐户数据提交 (F)
--ftp-alternative-to-user COMMAND 指定替换 "USER [name]" 的字符串 (F)
--ftp-create-dirs 如果不存在则创建远程目录 (F)
--ftp-method [MULTICWD/NOCWD/SINGLECWD] 控制 CWD (F)
--ftp-pasv 使用 PASV/EPSV 替换 PORT (F)
-P, --ftp-port ADR 使用指定 PORT 及地址替换 PASV (F)
--ftp-skip-pasv-ip 跳过 PASV 的IP地址 (F)
--ftp-pret 在 PASV 之前发送 PRET (drftpd) (F)
--ftp-ssl-ccc 在认证之后发送 CCC (F)
--ftp-ssl-ccc-mode ACTIVE/PASSIVE 设置 CCC 模式 (F)
--ftp-ssl-control ftp 登录时需要 SSL/TLS (F)
-G, --get 使用 HTTP GET 方法发送 -d 数据 (H)
-g, --globoff 禁用的 URL 队列 及范围使用 {} 和 []
-H, --header LINE 要发送到服务端的自定义请求头 (H)
-I, --head 仅显示响应文档头
-h, --help 显示帮助
-0, --http1.0 使用 HTTP 1.0 (H)
--ignore-content-length 忽略 HTTP Content-Length 头
-i, --include 在输出中包含协议头 (H/F)
-k, --insecure 允许连接到 SSL 站点,而不使用证书 (H)
--interface INTERFACE 指定网络接口/地址
-4, --ipv4 将域名解析为 IPv4 地址
-6, --ipv6 将域名解析为 IPv6 地址
-j, --junk-session-cookies 读取文件中但忽略会话cookie (H)
--keepalive-time SECONDS keepalive 包间隔
--key KEY 私钥文件名 (SSL/SSH)
--key-type TYPE 私钥文件类型 (DER/PEM/ENG) (SSL)
--krb LEVEL 启用指定安全级别的 Kerberos (F)
--libcurl FILE 命令的libcurl等价代码
--limit-rate RATE 限制传输速度
-l, --list-only 只列出FTP目录的名称 (F)
--local-port RANGE 强制使用的本地端口号
-L, --location 跟踪重定向 (H)
--location-trusted 类似 --location 并发送验证信息到其它主机 (H)
-M, --manual 显示全手动
--mail-from FROM 从这个地址发送邮件
--mail-rcpt TO 发送邮件到这个接收人(s)
--mail-auth AUTH 原始电子邮件的起始地址
--max-filesize BYTES 下载的最大文件大小 (H/F)
--max-redirs NUM 最大重定向数 (H)
-m, --max-time SECONDS 允许的最多传输时间
--metalink 处理指定的URL上的XML文件
--negotiate 使用 HTTP Negotiate 认证 (H)
-n, --netrc 必须从 .netrc 文件读取用户名和密码
--netrc-optional 使用 .netrc 或 URL; 将重写 -n 参数
--netrc-file FILE 设置要使用的 netrc 文件名
-N, --no-buffer 禁用输出流的缓存
--no-keepalive 禁用 connection 的 keepalive
--no-sessionid 禁止重复使用 SSL session-ID (SSL)
--noproxy 不使用代理的主机列表
--ntlm 使用 HTTP NTLM 认证 (H)
-o, --output FILE 将输出写入文件,而非 stdout
--pass PASS 传递给私钥的短语 (SSL/SSH)
--post301 在 301 重定向后不要切换为 GET 请求 (H)
--post302 在 302 重定向后不要切换为 GET 请求 (H)
--post303 在 303 重定向后不要切换为 GET 请求 (H)
-#, --progress-bar 以进度条显示传输进度
--proto PROTOCOLS 启用/禁用 指定的协议
--proto-redir PROTOCOLS 在重定向上 启用/禁用 指定的协议
-x, --proxy [PROTOCOL://]HOST[:PORT] 在指定的端口上使用代理
--proxy-anyauth 在代理上使用 "any" 认证方法 (H)
--proxy-basic 在代理上使用 Basic 认证 (H)
--proxy-digest 在代理上使用 Digest 认证 (H)
--proxy-negotiate 在代理上使用 Negotiate 认证 (H)
--proxy-ntlm 在代理上使用 NTLM 认证 (H)
-U, --proxy-user USER[:PASSWORD] 代理用户名及密码
--proxy1.0 HOST[:PORT] 在指定的端口上使用 HTTP/1.0 代理
-p, --proxytunnel 使用HTTP代理 (用于 CONNECT)
--pubkey KEY 公钥文件名 (SSH)
-Q, --quote CMD 在传输开始前向服务器发送命令 (F/SFTP)
--random-file FILE 读取随机数据的文件 (SSL)
-r, --range RANGE 仅检索范围内的字节
--raw 使用原始HTTP传输,而不使用编码 (H)
-e, --referer Referer URL (H)
-J, --remote-header-name 从远程文件读取头信息 (H)
-O, --remote-name 将输出写入远程文件
--remote-name-all 使用所有URL的远程文件名
-R, --remote-time 将远程文件的时间设置在本地输出上
-X, --request COMMAND 使用指定的请求命令
--resolve HOST:PORT:ADDRESS 将 HOST:PORT 强制解析到 ADDRESS
--retry NUM 出现问题时的重试次数
--retry-delay SECONDS 重试时的延时时长
--retry-max-time SECONDS 仅在指定时间段内重试
-S, --show-error 显示错误. 在选项 -s 中,当 curl 出现错误时将显示
-s, --silent Silent模式。不输出任务内容
--socks4 HOST[:PORT] 在指定的 host + port 上使用 SOCKS4 代理
--socks4a HOST[:PORT] 在指定的 host + port 上使用 SOCKSa 代理
--socks5 HOST[:PORT] 在指定的 host + port 上使用 SOCKS5 代理
--socks5-hostname HOST[:PORT] SOCKS5 代理,指定用户名、密码
--socks5-gssapi-service NAME 为gssapi使用SOCKS5代理服务名称
--socks5-gssapi-nec 与NEC Socks5服务器兼容
-Y, --speed-limit RATE 在指定限速时间之后停止传输
-y, --speed-time SECONDS 指定时间之后触发限速. 默认 30
--ssl 尝试 SSL/TLS (FTP, IMAP, POP3, SMTP)
--ssl-reqd 需要 SSL/TLS (FTP, IMAP, POP3, SMTP)
-2, --sslv2 使用 SSLv2 (SSL)
-3, --sslv3 使用 SSLv3 (SSL)
--ssl-allow-beast 允许的安全漏洞,提高互操作性(SSL)
--stderr FILE 重定向 stderr 的文件位置. - means stdout
--tcp-nodelay 使用 TCP_NODELAY 选项
-t, --telnet-option OPT=VAL 设置 telnet 选项
--tftp-blksize VALUE 设备 TFTP BLKSIZE 选项 (必须 >512)
-z, --time-cond TIME 基于时间条件的传输
-1, --tlsv1 使用 => TLSv1 (SSL)
--tlsv1.0 使用 TLSv1.0 (SSL)
--tlsv1.1 使用 TLSv1.1 (SSL)
--tlsv1.2 使用 TLSv1.2 (SSL)
--trace FILE 将 debug 信息写入指定的文件
--trace-ascii FILE 类似 --trace 但使用16进度输出
--trace-time 向 trace/verbose 输出添加时间戳
--tr-encoding 请求压缩传输编码 (H)
-T, --upload-file FILE 将文件传输(上传)到指定位置
--url URL 指定所使用的 URL
-B, --use-ascii 使用 ASCII/text 传输
-u, --user USER[:PASSWORD] 指定服务器认证用户名、密码
--tlsuser USER TLS 用户名
--tlspassword STRING TLS 密码
--tlsauthtype STRING TLS 认证类型 (默认 SRP)
--unix-socket FILE 通过这个 UNIX socket 域连接
-A, --user-agent STRING 要发送到服务器的 User-Agent (H)
-v, --verbose 显示详细操作信息
-V, --version 显示版本号并退出
-w, --write-out FORMAT 完成后输出什么
--xattr 将元数据存储在扩展文件属性中
-q .curlrc 如果作为第一个参数无效
4.curl命令的使用范例
curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。
它支持多种协议,下面举例讲解如何将它用于网站开发。
一、查看网页源码
直接在curl命令后加上网址,就可以看到网页源码。我们以网址www.sina.com为例(选择该网址,主要因为它的网页代码较短):
curl www.sina.com
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.sina.com.cn/">here</a>.</p>
</body></html>
如果要把这个网页保存下来,可以使用`-o`参数,这就相当于使用wget命令了。
curl -o [文件名] www.sina.com
二、自动跳转
有的网址是自动跳转的。使用`-L`参数,curl就会跳转到新的网址。
curl -L www.sina.com
键入上面的命令,结果就自动跳转为www.sina.com.cn。
三、显示头信息
`-i`参数可以显示http response的头信息,连同网页代码一起。
curl -i www.sina.com
HTTP/1.0 301 Moved Permanently
Date: Sat, 03 Sep 2011 23:44:10 GMT
Server: Apache/2.0.54 (Unix)
Location: http://www.sina.com.cn/
Cache-Control: max-age=3600
Expires: Sun, 04 Sep 2011 00:44:10 GMT
Vary: Accept-Encoding
Content-Length: 231
Content-Type: text/html; charset=iso-8859-1
Age: 3239
X-Cache: HIT from sh201-9.sina.com.cn
Connection: close
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.sina.com.cn/">here</a>.</p>
</body></html>
`-I`参数则是只显示http response的头信息。
四、显示通信过程
`-v`参数可以显示一次http通信的整个过程,包括端口连接和http request头信息。
curl -v www.sina.com
* About to connect() to www.sina.com port 80 (#0)
* Trying 61.172.201.195... connected
* Connected to www.sina.com (61.172.201.195) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.21.3 (i686-pc-linux-gnu) libcurl/7.21.3 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: www.sina.com
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 301 Moved Permanently
< Date: Sun, 04 Sep 2011 00:42:39 GMT
< Server: Apache/2.0.54 (Unix)
< Location: http://www.sina.com.cn/
< Cache-Control: max-age=3600
< Expires: Sun, 04 Sep 2011 01:42:39 GMT
< Vary: Accept-Encoding
< Content-Length: 231
< Content-Type: text/html; charset=iso-8859-1
< X-Cache: MISS from sh201-19.sina.com.cn
< Connection: close
<
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.sina.com.cn/">here</a>.</p>
</body></html>
* Closing connection #0
如果你觉得上面的信息还不够,那么下面的命令可以查看更详细的通信过程。
curl --trace output.txt www.sina.com
或者
curl --trace-ascii output.txt www.sina.com
运行后,请打开output.txt文件查看。
五、发送表单信息
发送表单信息有GET和POST两种方法。GET方法相对简单,只要把数据附在网址后面就行。
curl example.com/form.cgi?data=xxx
POST方法必须把数据和网址分开,curl就要用到--data参数。
curl -X POST --data "data=xxx" example.com/form.cgi
如果你的数据没有经过表单编码,还可以让curl为你编码,参数是`--data-urlencode`。
curl -X POST--data-urlencode "date=April 1" example.com/form.cgi
六、HTTP动词
curl默认的HTTP动词是GET,使用`-X`参数可以支持其他动词。
curl -X POST www.example.com
curl -X DELETE www.example.com
七、文件上传
假定文件上传的表单是下面这样:
<form method="POST" enctype='multipart/form-data' action="upload.cgi">
<input type=file name=upload>
<input type=submit name=press value="OK">
</form>
你可以用curl这样上传文件:
curl --form upload=@localfilename --form press=OK [URL]
八、Referer字段
有时你需要在http request头信息中,提供一个referer字段,表示你是从哪里跳转过来的。
curl --referer http://www.example.com http://www.example.com
九、User Agent字段
这个字段是用来表示客户端的设备信息。服务器有时会根据这个字段,针对不同设备,返回不同格式的网页,比如手机版和桌面版。
iPhone4的User Agent是
Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7
curl可以这样模拟:
curl --user-agent "[User Agent]" [URL]
十、cookie
使用`--cookie`参数,可以让curl发送cookie。
curl --cookie "name=xxx" www.example.com
至于具体的cookie的值,可以从http response头信息的`Set-Cookie`字段中得到。
`-c cookie-file`可以保存服务器返回的cookie到文件,`-b cookie-file`可以使用这个文件作为cookie信息,进行后续的请求。
curl -c cookies http://example.com
curl -b cookies http://example.com
十一、增加头信息
有时需要在http request之中,自行增加一个头信息。`--header`参数就可以起到这个作用。
curl --header "Content-Type:application/json" http://example.com
十二、HTTP认证
有些网域需要HTTP认证,这时curl需要用到`--user`参数。
curl --user name:password example.com
不带有任何参数时,curl 就是发出 GET 请求。
curl https://www.example.com
上面命令向www.example.com发出 GET 请求,服务器返回的内容会在命令行输出。
-A
-A参数指定客户端的用户代理标头,即User-Agent。curl 的默认用户代理字符串是curl/[version]。 curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com
上面命令将User-Agent改成 Chrome 浏览器。
curl -A '' https://google.com
上面命令会移除User-Agent标头。
也可以通过-H参数直接指定标头,更改User-Agent。 curl -H 'User-Agent: php/1.0' https://google.com
-b
-b参数用来向服务器发送 Cookie。
curl -b 'foo=bar' https://google.com
上面命令会生成一个标头Cookie: foo=bar,向服务器发送一个名为foo、值为bar的 Cookie。 curl -b 'foo1=bar;foo2=bar2' https://google.com
上面命令发送两个 Cookie。
curl -b cookies.txt https://www.google.com
上面命令读取本地文件cookies.txt,里面是服务器设置的 Cookie(参见-c参数),将其发送到服务器。
-c
-c参数将服务器设置的 Cookie 写入一个文件。 curl -c cookies.txt https://www.google.com
上面命令将服务器的 HTTP 回应所设置 Cookie 写入文本文件cookies.txt。
-d
-d参数用于发送 POST 请求的数据体。
curl -d'login=emma&password=123'-X POST https://google.com/login
# 或者 curl -d 'login=emma' -d 'password=123' -X POST https://google.com/login
使用-d参数以后,HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法,因此可以省略-X POST。
-d参数可以读取本地文本文件的数据,向服务器发送。
curl -d '@data.txt' https://google.com/login
上面命令读取data.txt文件的内容,作为数据体向服务器发送。
--data-urlencode
--data-urlencode参数等同于-d,发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。 curl --data-urlencode 'comment=hello world' https://google.com/login
上面代码中,发送的数据hello world之间有一个空格,需要进行 URL 编码。
-e
-e参数用来设置 HTTP 的标头Referer,表示请求的来源。
curl -e 'https://google.com?q=example' https://www.example.com
上面命令将Referer标头设为https://google.com?q=example。
-H参数可以通过直接添加标头Referer,达到同样效果。
curl -H 'Referer: https://google.com?q=example' https://www.example.com
-F
-F参数用来向服务器上传二进制文件。
curl -F 'file=@photo.png' https://google.com/profile
上面命令会给 HTTP 请求加上标头Content-Type: multipart/form-data,然后将文件photo.png作为file字段上传。
-F参数可以指定 MIME 类型。 curl -F 'file=@photo.png;type=image/png' https://google.com/profile
上面命令指定 MIME 类型为image/png,否则 curl 会把 MIME 类型设为application/octet-stream。
-F参数也可以指定文件名。
curl -F 'file=@photo.png;filename=me.png' https://google.com/profile
上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png。
-G
-G参数用来构造 URL 的查询字符串。 curl -G -d 'q=kitties' -d 'count=20' https://google.com/search
上面命令会发出一个 GET 请求,实际请求的 URL 为https://google.com/search?q=kitties&count=20。如果省略--G,会发出一个 POST 请求。
如果数据需要 URL 编码,可以结合--data--urlencode参数。
curl -G --data-urlencode 'comment=hello world' https://www.example.com
-H
-H参数添加 HTTP 请求的标头。 curl -H 'Accept-Language: en-US' https://google.com
上面命令添加 HTTP 标头Accept-Language: en-US。
curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' https://google.com
上面命令添加两个 HTTP 标头。 curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://google.com/login
上面命令添加 HTTP 请求的标头是Content-Type: application/json,然后用-d参数发送 JSON 数据。
-i
-i参数打印出服务器回应的 HTTP 标头。
curl -i https://www.example.com
上面命令收到服务器回应后,先输出服务器回应的标头,然后空一行,再输出网页的源码。
-I
-I参数向服务器发出 HEAD 请求,然会将服务器返回的 HTTP 标头打印出来。 curl -I https://www.example.com
上面命令输出服务器对 HEAD 请求的回应。
--head参数等同于-I。
curl --head https://www.example.com
-k
-k参数指定跳过 SSL 检测。 curl -k https://www.example.com
上面命令不会检查服务器的 SSL 证书是否正确。
-L
-L参数会让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向。
curl -L -d 'tweet=hi' https://api.twitter.com/tweet
--limit-rate
--limit-rate用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境。 curl --limit-rate 200k https://google.com
上面命令将带宽限制在每秒 200K 字节。
-o
-o参数将服务器的回应保存成文件,等同于wget命令。
curl -o example.html https://www.example.com
上面命令将www.example.com保存成example.html。
-O
-O参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。 curl -O https://www.example.com/foo/bar.html
上面命令将服务器回应保存成文件,文件名为bar.html。
-s
-s参数将不输出错误和进度信息。
curl -s https://www.example.com
上面命令一旦发生错误,不会显示错误信息。不发生错误的话,会正常显示运行结果。
如果想让 curl 不产生任何输出,可以使用下面的命令。 curl -s -o /dev/null https://google.com
-S
-S参数指定只输出错误信息,通常与-s一起使用。
curl -s -o /dev/null https://google.com
上面命令没有任何输出,除非发生错误。
-u
-u参数用来设置服务器认证的用户名和密码。 curl -u 'bob:12345' https://google.com/login
上面命令设置用户名为bob,密码为12345,然后将其转为 HTTP 标头Authorization: Basic Ym9iOjEyMzQ1。
curl 能够识别 URL 里面的用户名和密码。
curl https://bob:12345@google.com/login
上面命令能够识别 URL 里面的用户名和密码,将其转为上个例子里面的 HTTP 标头。 curl -u 'bob' https://google.com/login
上面命令只设置了用户名,执行后,curl 会提示用户输入密码。
-v
-v参数输出通信的整个过程,用于调试。
curl -v https://www.example.com
--trace参数也可以用于调试,还会输出原始的二进制数据。 curl --trace - https://www.example.com
-x
-x参数指定 HTTP 请求的代理。
curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com
上面命令指定 HTTP 请求通过myproxy.com:8080的 socks5 代理发出。
如果没有指定代理协议,默认为 HTTP。 curl -x james:cats@myproxy.com:8080 https://www.example.com
上面命令中,请求的代理使用 HTTP 协议。
-X
-X参数指定 HTTP 请求的方法。
$ curl -X POST https://www.example.com
上面命令对https://www.example.com发出 POST 请求。
二、wget命令详解
导读: wget是Linux中的一个下载文件的工具,wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上。
它用在命令行下。对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器。如果我们使用虚拟主机,处理这样的事务我们只能先从远程服务器下载到我们电脑磁盘,然后再用ftp工具上传到服务器。这样既浪费时间又浪费精力,那不没办法的事。而到了Linux VPS,它则可以直接下载到服务器而不用经过上传这一步。wget工具体积小但功能完善,它支持断点下载功能,同时支持FTP和HTTP下载方式,支持代理服务器和设置起来方便简单。下面我们以实例的形式说明怎么使用wget。
1. 安装wget
[root@network test]# yum install -y wget
查看帮助手册
[root@network test]# wget --help
GNU Wget 1.14,非交互式的网络文件下载工具。
用法: wget [选项]... [URL]...
长选项所必须的参数在使用短选项时也是必须的。
# 1.启动:
-V, --version 显示 Wget 的版本信息并退出。
-h, --help 打印此帮助。
-b, --background 启动后转入后台。
-e, --execute=COMMAND 运行一个“.wgetrc”风格的命令。
# 2.日志和输入文件:
-o, --output-file=FILE 将日志信息写入 FILE。
-a, --append-output=FILE 将信息添加至 FILE。
-d, --debug 打印大量调试信息。
-q, --quiet 安静模式 (无信息输出)。
-v, --verbose 详尽的输出 (此为默认值)。
-nv, --no-verbose 关闭详尽输出,但不进入安静模式。
--report-speed=TYPE Output bandwidth as TYPE. TYPE can be bits.
-i, --input-file=FILE 下载本地或外部 FILE 中的 URLs。
-F, --force-html 把输入文件当成 HTML 文件。
-B, --base=URL 解析与 URL 相关的
HTML 输入文件 (由 -i -F 选项指定)。
--config=FILE Specify config file to use.
# 3.下载:
-t, --tries=NUMBER 设置重试次数为 NUMBER (0 代表无限制)。
--retry-connrefused 即使拒绝连接也是重试。
-O, --output-document=FILE 将文档写入 FILE。
-nc, --no-clobber skip downloads that would download to
existing files (overwriting them).
-c, --continue 断点续传下载文件。
--progress=TYPE 选择进度条类型。
-N, --timestamping 只获取比本地文件新的文件。
--no-use-server-timestamps 不用服务器上的时间戳来设置本地文件。
-S, --server-response 打印服务器响应。
--spider 不下载任何文件。
-T, --timeout=SECONDS 将所有超时设为 SECONDS 秒。
--dns-timeout=SECS 设置 DNS 查寻超时为 SECS 秒。
--connect-timeout=SECS 设置连接超时为 SECS 秒。
--read-timeout=SECS 设置读取超时为 SECS 秒。
-w, --wait=SECONDS 等待间隔为 SECONDS 秒。
--waitretry=SECONDS 在获取文件的重试期间等待 1..SECONDS 秒。
--random-wait 获取多个文件时,每次随机等待间隔
0.5*WAIT...1.5*WAIT 秒。
--no-proxy 禁止使用代理。
-Q, --quota=NUMBER 设置获取配额为 NUMBER 字节。
--bind-address=ADDRESS 绑定至本地主机上的 ADDRESS (主机名或是 IP)。
--limit-rate=RATE 限制下载速率为 RATE。
--no-dns-cache 关闭 DNS 查寻缓存。
--restrict-file-names=OS 限定文件名中的字符为 OS 允许的字符。
--ignore-case 匹配文件/目录时忽略大小写。
-4, --inet4-only 仅连接至 IPv4 地址。
-6, --inet6-only 仅连接至 IPv6 地址。
--prefer-family=FAMILY 首先连接至指定协议的地址
FAMILY 为 IPv6,IPv4 或是 none。
--user=USER 将 ftp 和 http 的用户名均设置为 USER。
--password=PASS 将 ftp 和 http 的密码均设置为 PASS。
--ask-password 提示输入密码。
--no-iri 关闭 IRI 支持。
--local-encoding=ENC IRI (国际化资源标识符) 使用 ENC 作为本地编码。
--remote-encoding=ENC 使用 ENC 作为默认远程编码。
--unlink remove file before clobber.
# 4.目录:
-nd, --no-directories 不创建目录。
-x, --force-directories 强制创建目录。
-nH, --no-host-directories 不要创建主目录。
--protocol-directories 在目录中使用协议名称。
-P, --directory-prefix=PREFIX 以 PREFIX/... 保存文件
--cut-dirs=NUMBER 忽略远程目录中 NUMBER 个目录层。
# 5.HTTP 选项:
--http-user=USER 设置 http 用户名为 USER。
--http-password=PASS 设置 http 密码为 PASS。
--no-cache 不在服务器上缓存数据。
--default-page=NAME 改变默认页
(默认页通常是“index.html”)。
-E, --adjust-extension 以合适的扩展名保存 HTML/CSS 文档。
--ignore-length 忽略头部的‘Content-Length’区域。
--header=STRING 在头部插入 STRING。
--max-redirect 每页所允许的最大重定向。
--proxy-user=USER 使用 USER 作为代理用户名。
--proxy-password=PASS 使用 PASS 作为代理密码。
--referer=URL 在 HTTP 请求头包含‘Referer: URL’。
--save-headers 将 HTTP 头保存至文件。
-U, --user-agent=AGENT 标识为 AGENT 而不是 Wget/VERSION。
--no-http-keep-alive 禁用 HTTP keep-alive (永久连接)。
--no-cookies 不使用 cookies。
--load-cookies=FILE 会话开始前从 FILE 中载入 cookies。
--save-cookies=FILE 会话结束后保存 cookies 至 FILE。
--keep-session-cookies 载入并保存会话 (非永久) cookies。
--post-data=STRING 使用 POST 方式;把 STRING 作为数据发送。
--post-file=FILE 使用 POST 方式;发送 FILE 内容。
--content-disposition 当选中本地文件名时
允许 Content-Disposition 头部 (尚在实验)。
--content-on-error output the received content on server errors.
--auth-no-challenge 发送不含服务器询问的首次等待
的基本 HTTP 验证信息。
# 6.HTTPS (SSL/TLS) 选项:
--secure-protocol=PR choose secure protocol, one of auto, SSLv2,
SSLv3, TLSv1, TLSv1_1 and TLSv1_2.
--no-check-certificate 不要验证服务器的证书。
--certificate=FILE 客户端证书文件。
--certificate-type=TYPE 客户端证书类型,PEM 或 DER。
--private-key=FILE 私钥文件。
--private-key-type=TYPE 私钥文件类型,PEM 或 DER。
--ca-certificate=FILE 带有一组 CA 认证的文件。
--ca-directory=DIR 保存 CA 认证的哈希列表的目录。
--random-file=FILE 带有生成 SSL PRNG 的随机数据的文件。
--egd-file=FILE 用于命名带有随机数据的 EGD 套接字的文件。
# 7.FTP 选项:
--ftp-user=USER 设置 ftp 用户名为 USER。
--ftp-password=PASS 设置 ftp 密码为 PASS。
--no-remove-listing 不要删除‘.listing’文件。
--no-glob 不在 FTP 文件名中使用通配符展开。
--no-passive-ftp 禁用“passive”传输模式。
--preserve-permissions 保留远程文件的权限。
--retr-symlinks 递归目录时,获取链接的文件 (而非目录)。
# 8.WARC options:
--warc-file=FILENAME save request/response data to a .warc.gz file.
--warc-header=STRING insert STRING into the warcinfo record.
--warc-max-size=NUMBER set maximum size of WARC files to NUMBER.
--warc-cdx write CDX index files.
--warc-dedup=FILENAME do not store records listed in this CDX file.
--no-warc-compression do not compress WARC files with GZIP.
--no-warc-digests do not calculate SHA1 digests.
--no-warc-keep-log do not store the log file in a WARC record.
--warc-tempdir=DIRECTORY location for temporary files created by the
WARC writer.
# 9.递归下载:
-r, --recursive 指定递归下载。
-l, --level=NUMBER 最大递归深度 (inf 或 0 代表无限制,即全部下载)。
--delete-after 下载完成后删除本地文件。
-k, --convert-links 让下载得到的 HTML 或 CSS 中的链接指向本地文件。
--backups=N before writing file X, rotate up to N backup files.
-K, --backup-converted 在转换文件 X 前先将它备份为 X.orig。
-m, --mirror -N -r -l inf --no-remove-listing 的缩写形式。
-p, --page-requisites 下载所有用于显示 HTML 页面的图片之类的元素。
--strict-comments 用严格方式 (SGML) 处理 HTML 注释。
# 10.递归接受/拒绝:
-A, --accept=LIST 逗号分隔的可接受的扩展名列表。
-R, --reject=LIST 逗号分隔的要拒绝的扩展名列表。
--accept-regex=REGEX regex matching accepted URLs.
--reject-regex=REGEX regex matching rejected URLs.
--regex-type=TYPE regex type (posix|pcre).
-D, --domains=LIST 逗号分隔的可接受的域列表。
--exclude-domains=LIST 逗号分隔的要拒绝的域列表。
--follow-ftp 跟踪 HTML 文档中的 FTP 链接。
--follow-tags=LIST 逗号分隔的跟踪的 HTML 标识列表。
--ignore-tags=LIST 逗号分隔的忽略的 HTML 标识列表。
-H, --span-hosts 递归时转向外部主机。
-L, --relative 只跟踪有关系的链接。
-I, --include-directories=LIST 允许目录的列表。
--trust-server-names use the name specified by the redirection
url last component.
-X, --exclude-directories=LIST 排除目录的列表。
-np, --no-parent 不追溯至父目录。
2. 使用wget下载文件
1.) 下载单个文件
以下的例子是从网络下载一个文件并保存在当前目录
在下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)。
wget http://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
2.) 以不同的文件名保存 -O
[root@network test]# wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
[root@network test]# ls
wordpress-4.9.4-zh_CN.tar.gz
- 我们可以使用参数-O来指定一个文件名:
wget -O wordpress.tar.gz http://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
wordpress.tar.gz
3.) 断点续传 -c
# 使用wget -c重新启动下载中断的文件:
对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件
wget -c https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
4.) 后台下载 -b
# 对于下载非常大的文件的时候,我们可以使用参数-b进行后台下载
[root@network test]# wget -b https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
继续在后台运行,pid 为 1463。
将把输出写入至 “wget-log”。
# 可以使用以下命令来察看下载进度:
[root@network test]# tail -f wget-log
8550K .......... .......... .......... .......... .......... 96% 814K 0s
8600K .......... .......... .......... .......... .......... 97% 9.53M 0s
8650K .......... .......... .......... .......... .......... 98% 86.8M 0s
8700K .......... .......... .......... .......... .......... 98% 145M 0s
8750K .......... .......... .......... .......... .......... 99% 67.4M 0s
8800K .......... .......... .......... .......... .......... 99% 107M 0s
8850K .......... ......... 100% 1.95M=16s
2018-11-10 15:39:07 (564 KB/s) - 已保存 “wordpress-4.9.4-zh_CN.tar.gz.2” [9082696/9082696])
5.) 伪装代理名称下载
有些网站能通过根据判断代理名称不是浏览器而拒绝你的下载请求。
不过你可以通过–user-agent参数伪装。
6.) 测试下载链接
# 进行定时下载,应该在预定时间测试下载链接是否有效。我们可以增加–spider参数进行测试检查:
wget –spider URL
1.如果下载链接正确,将会显示
wget –spider URL
Spider mode enabled. Check if remote file exists.
HTTP request sent, awaiting response… 200 OK
Length: unspecified [text/html]
Remote file exists and could contain further links,
but recursion is disabled — not retrieving.
2.这保证了下载能在预定的时间进行,但当你给错了一个链接,将会显示如下错误
wget –spider url
Spider mode enabled. Check if remote file exists.
HTTP request sent, awaiting response… 404 Not Found
Remote file does not exist — broken link!!!
你可以在以下几种情况下使用spider参数:
1. 定时下载之前进行检查
2. 间隔检测网站是否可用
3. 检查网站页面的死链接
7.) 增加重试次数
如果网络有问题或下载一个大文件也有可能失败。wget默认重试20次连接下载文件。如果需要,你可以使用–tries增加重试次数。
wget –tries=40 URL
8.) 下载多个文件 -i
1.首先,保存一份下载链接文件
cat > filelist.txt
url1
url2
url3
url4
2.接着使用这个文件和参数-i下载
wget -i filelist.txt
9.) 镜像网站 –mirror
10.) 过滤指定格式下载 –reject
# 下载一个网站,但你不希望下载图片:
wget –reject=gif url
11.) 把下载信息存入日志文件 -o
你不希望下载信息直接显示在终端而是在一个日志文件,可以使用以下命令:
wget -o download.log URL
使用wget -O下载并以不同的文件名保存(-O:下载文件到对应目录,并且修改文件名称)
wget -O wordpress.zip http:``//www``.minjieren.com``/download``.aspx?``id``=1080
12.) 其他参数
- 限制总下载文件大小 -Q
当你想要下载的文件超过5M而退出下载,你可以使用以下命令:
wget -Q5m -i filelist.txt
注意:这个参数对单个文件下载不起作用,只能递归下载时才有效。
- 下载指定格式文件 -r -A
可以在以下情况使用该功能:
1.下载一个网站的所有图片
2.下载一个网站的所有视频
3.下载一个网站的所有PDF文件
wget -r -A.pdf url
- 使用wget FTP下载
使用wget来完成ftp链接的下载。 使用wget匿名ftp下载
wget ftp-url
使用wget用户名和密码认证的ftp下载
wget --ftp-user=USERNAME --ftp-password=PASSWORD url