Curl运维命令 - 日常用法总结
在Linux系统中,curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载操作,是综合传输工具,习惯上称url为下载工具。下面就日常运维中基于curl命令使用做下总结(用法、详解、指南):
一、Curl命令用法
1. curl语法和参数选项
# curl [option] [url]
curl常见参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | -a /--append 上传文件时,附加到目标文件 -A /--user-agent <string> 设置用户代理发送给服务器 -b /--cookie <name=string /file > cookie字符串或文件读取位置 -c /--cookie-jar < file > 操作结束后把cookie写入到这个文件中 -C /--continue-at <offset> 断点续转 -D /--dump-header < file > 把header信息写入到该文件中 -e /--referer 来源网址 -f /--fail 连接失败时不显示http错误 -o /--output 把输出写到该文件中 -O /--remote-name 把输出写到该文件中,保留远程文件的文件名 -r /--range <range> 检索来自HTTP /1 .1或FTP服务器字节范围 -s /--silent 静音模式。不输出任何东西 -T /--upload-file < file > 上传文件 -u /--user <user[:password]> 设置服务器的用户和密码 -w /--write-out [ format ] 什么输出完成后 -x /--proxy <host[:port]> 在给定的端口上使用HTTP代理 - #/--progress-bar 进度条显示当前的传送状态。或者直接使用"--progress" |
2. curl使用说明
curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。它支持多种协议,下面说下curl命令的日常使用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 | 1)获取页面内容,即查看网页源码 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 当不加任何option使用 curl 时,默认会发送 GET 请求来获取链接内容到标准输出 [root@ss-server ~] # curl https://www.baidu.com 2)显示http头部信息,即只打印响应头部信息 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 如果只想要显示 HTTP 头,而不显示文件内容,可以使用 -I 或 -- head 选项 [root@ss-server ~] # curl --head https://www.baidu.com [root@ss-server ~] # curl -I https://www.baidu.com HTTP /1 .1 200 OK Accept-Ranges: bytes Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform Connection: Keep-Alive Content-Length: 277 Content-Type: text /html Date: Mon, 23 Dec 2019 10:50:55 GMT Etag: "575e1f6f-115" Last-Modified: Mon, 13 Jun 2016 02:50:23 GMT Pragma: no-cache Server: bfe /1 .0.8.18 如果想要同时显示 HTTP 头和文件内容,使用 -i 选项 [root@ss-server ~] # curl -i https://www.baidu.com 注意: "-I" 参数则是只显示http response的头信息。 "-i" 参数可以显示http response的头信息,连同网页代码一起。 3)显示通信过程 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "-v" 参数可以显示一次http通信的整个过程,包括端口连接和http request头信息。 [root@ss-server ~] # curl -v www.sina.com 如果觉得上面的信息还不够,可以使用下面的命令查看更详细的通信过程。 [root@ss-server ~] # curl --trace output.txt www.sina.com 或者 [root@ss-server ~] # curl --trace-ascii output.txt www.sina.com 运行后,可以打开output.txt文件查看。 4)下载页面 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。如果系统没有curl可以使用 "yum install curl" 安装,也可以下载安装。 curl是将下载链接输出到stdout,将进度信息输出到stderr。 --silent选项:表示不显示进度条信息 --progress选项:表示显示进度条信息。或者使用 "-#" ,或者使用 "--progress-bar" [root@ss-server ~] # curl --silent https://www.baidu.com 这条命令是将下载链接输出到终端,所有下载的数据都被写入到stdout。 还可以将下载的链接保存到文件 可以使用 > 符号将输出重定向到本地文件中。 [root@ss-server ~] # curl --silent https://www.baidu.com > haha.txt -o(小写的 o):结果会被保存到命令行中提供的文件名 -O(大写的 O):URL 中的文件名会被用作保存输出的文件名 [root@ss-server ~] # curl https://www.baidu.com -o baobei.txt --progress [root@ss-server ~] # curl --silent -O https://www.baidu.com/haha.html 需要注意: 使用 -O 选项时,必须确保链接末尾包含文件名,否则 curl 无法正确保存文件。 如果遇到链接中无文件名的情况,应该使用 -o 选项手动指定文件名,或使用重定向符号。 5)同时下载多个页面 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 以使用 -o 或 -O 选项来同时指定多个链接,按照以下格式编写命令: [root@ss-server ~] # curl -O https://www.baidu.com/haha/page1.html -O https://www.baidu.com/haha/page2.html 或者: [root@ss-server ~] # curl -o page1 https://www.baidu.com/haha/page1.html -o page2 https://www.baidu.com/haha/page2.html 6)使用-L跟随链接重定向,即自动跳转 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 如果直接使用curl打开某些被重定向后的链接,这种情况下就无法获取想要的网页内容。 使用 "-L" 参数,curl就会自动跳转到新的网址。 [root@ss-server ~] # curl http://kevin.com 会得到如下信息: <html> < head ><title>301 Moved Permanently< /title >< /head > <body bgcolor= "white" > <center><h1>301 Moved Permanently< /h1 >< /center > <hr><center>nginx /1 .10.3< /center > < /body > < /html > 而当通过浏览器打开该链接时,会自动跳转到 http: //www .kevin.com。 此时如果想要curl做的,就是像浏览器一样跟随链接的跳转,获取最终的网页内容。 这时就需要在命令中添加-L选项来跟随链接重定向,这样就能获取到经过重定向后的网页内容了。 [root@ss-server ~] # curl -L http://kevin.com 7)断点续传 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 偏移量是以字节为单位的整数,如果让curl自动推断出正确的续传位置使用-C -: # curl -C - URL [root@ss-server ~] # curl -C - https://www.baidu.com 8)提供Referer字段,设置参照页字符串 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 参照页是位于HTTP头部中的一个字符串,用来表示用户是从哪个页面到达当前页面的。 如果用户点击网页A中的某个连接,那么用户就会跳转到B网页,网页B头部的参照页字符串就包含网页A的URL。 使用--referer选项指定参照页字符串,即查看来源网址。 有时需要在http request头信息中,提供一个referer字段,表示你是从哪里跳转过来的。 [root@ss-server ~] # curl --referer https://www.baidu.com https://www.baidu.com 9)设置cookies >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 当使用curl访问页面的时候,默认是不会保存 Cookie 的。有些情况下我们希望保存 Cookie 以便下次访问时使用。例如登陆了某个网站,我们希望再次访问该网站时保持登陆的状态,这时就可以现将登陆时的 Cookie 保存起来,下次访问时再读取。 使用--cookie "COKKIES" 选项来指定cookie,多个cookie使用分号分隔: # curl --cookie "name=xxxx" www.example.com # curl --cookie "name=xxxx;age=xxxx;address=xxxx" www.example.com 如下命令,表示将url中的user和pass内容发送给了cookie [root@ss-server ~] # curl https://www.baidu.com --cookie "user=root;pass=123456" 至于具体的cookie的值,可以从http response头信息的 'Set-Cookie' 字段中得到。 如果想要将cookie另存为一个文件,使用--cookie-jar选项,即-c参数。 '-c cookie-file' 可以保存服务器返回的cookie到文件; '-b cookie-file' 可以读取这个文件作为cookie信息,进行后续的请求。 [root@ss-server ~] # curl --cookie-jar cookie_txt https://www.baidu.com [root@ss-server ~] # curl -c cookie_txt https://www.baidu.com [root@ss-server ~] # curl -b haha.txt https://www.baidu.com 10)自定义User-Agent字段,设置用户代理字符串 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 这个字段是用来表示客户端的设备信息。服务器有时会根据这个字段,针对不同设备,返回不同格式的网页。 有些网站访问会提示只能使用IE浏览器来访问,这是因为这些网站设置了检查用户代理,可以使用curl把用户代理设置为IE,这样就可以访问了。 使用--user-agent或者-A选项自定义用户代理,命令如下: # curl URL --user-agent "Mozilla/5.0" # curl URL -A "Mozilla/5.0" [root@ss-server ~] # curl https://www.baidu.com --user-agent "Mozilla/5.0" 例如下面的命令将伪装成安卓火狐浏览器对网页进行请求(使用-H也可以实现同样的目的,见下面说明): [root@ss-server ~] # curl -A "Mozilla/5.0 (Android; Mobile; rv:35.0) Gecko/35.0 Firefox/35.0" http://www.baidu.com 11)使用 -H 自定义 header >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 当使用curl访问页面,需要传递特定的header的时候,可以仿照以下命令来写: [root@ss-server ~] # curl -H "Referer: www.example.com" -H "User-Agent: Custom-User-Agent" http://www.baidu.com 可以看到,当使用-H 来自定义User-Agent时,需要使用 "User-Agent: xxx" 的格式。-H可以传递多个Header头部信息 也能够直接在 header 中传递 Cookie,格式与上面的例子一样(指定cookie的其他方式已在上面介绍过): [root@ss-server ~] # curl -H "Cookie: JSESSIONID=D0112A5063D938586B659EF8F939BE24" http://www.example.com 12)curl的带宽控制和下载配额 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 使用--limit-rate限制curl的下载速度,如下命令中用k(千字节)和m(兆字节)指定下载速度限制。 [root@ss-server ~] # curl https://www.baidu.com --limit-rate 50k [root@ss-server ~] # curl https://www.baidu.com --limit-rate 5m 使用--max-filesize指定可下载的最大文件大小。 如果文件大小超出限制,命令则返回一个非0退出码,如果命令正常则返回0。 # curl URL --max-filesize bytes [root@ss-server ~] # curl https://www.baidu.com --max-filesize 10000 13)用curl进行认证 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 使用curl选项 -u 可以完成HTTP或者FTP的认证,可以指定密码,也可以不指定密码在后续操作中输入密码: # curl -u user:pwd http://man.linuxde.net # curl -u user http://man.linuxde.net 如下,登录这个页面需要输入用户名和密码,可以使用-u参数进行认证 [root@ss-server ~] # curl -u kevin:wanhju1980@123 https://account.cnblogs.com/signin?returnUrl=http%3a%2f%2fi.cnblogs.com%2f 或者: [root@ss-server ~] # curl -u kevin https://account.cnblogs.com/signin?returnUrl=http%3a%2f%2fi.cnblogs.com%2f Enter host password for user 'kevin' : 14)发送表单信息 发送表单信息有GET和POST两种方法。 GET方法相对简单,只要把数据附在网址后面就行(http: // 可以省略)。 [root@ss-server ~] # curl example.com/form.cgi?data=xxx [root@ss-server ~] # curl http://example.com/form.cgi?data=xxx POST方法必须把数据和网址分开,curl就要用到--data参数或-d参数。 [root@ss-server ~] # curl -X POST --data "data=xxx" http://example.com/form.cgi [root@ss-server ~] # curl -X POST -d "data=xxx" http://example.com/form.cgi 如果数据没有经过表单编码,还可以让curl为你编码,参数是 "--data-urlencode" [root@ss-server ~] # curl -X POST --data-urlencode "date=April 1" example.com/form.cgi 再来看下面一个例子: ############ 使用-d发送POST请求 ############ 以登陆网页为例来进行说明使用curl发送POST请求的方法。 假设有一个登录页面www.example.com /login ,只需要提交用户名和密码便可登录。 则可以使用 cURL 来完成这个POST请求。 -d 用于指定发送的数据,相当于-- date -X 用于指定发送数据的方式: [root@ss-server ~] # curl -d "userName=kevin&passwd=123456" -X POST http://www.example.com/login 在使用-d的情况下,如果省略 -X,则默认为 POST 方式: [root@ss-server ~] # curl -d "userName=kevin&passwd=123456" http://www.example.com/login ############ 强制使用GET方式 ############ # curl -d "somedata" -X GET http://www.example.com/api 或者使用 -G 选项: # curl -d "somedata" -G http://www.example.com/api GET方法只要把数据附在网址后面就行。 # curl example.com/form.cgi?data=xxx curl默认的HTTP动词是GET,使用-X参数可以支持其他动词。例如: # curl -X DELETE ############ 从文件中读取data ############ # curl -d "@data.txt" http://www.example.com/login ############ 带Cookie登录 ############ 如果再次访问该网站,仍然会变成未登录的状态。可以用之前提到的方法保存 Cookie,在每次访问网站时都带上该 Cookie 以保持登录状态。 '-c cookie-file' 可以保存服务器返回的cookie到文件; [root@ss-server ~] # curl -c "cookie-login" -d "userName=tom&passwd=123456" http://www.example.com/login 再次访问该网站时,使用以下命令: '-b cookie-file' 可以读取这个文件作为cookie信息,进行后续的请求。 [root@ss-server ~] # curl -b "cookie-login" http://www.example.com/login 这样,就能保持访问的是登录后的页面了。 15)HTTP动词 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> curl默认的HTTP动词是GET,使用`-X`参数可以支持其他动词。 [root@ss-server ~] # curl -X POST www.example.com [root@ss-server ~] # curl -X DELETE www.example.com |
3. curl上传文件的用法(POST请求方式)
一般来说,我们都会用curl下载网页,但是curl上传文件则不常用。下面说下curl模拟"multipart/form-data"形式的form上传文件, 命令稍稍复杂些。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 之前的请求基本都是只传输字符串,如果需要上传文件,比如在测试上传接口的时候,会要求传输文件,其实这个对于curl来说,也是很容器的! 使用-F "file=@__FILE_PATH__" 的请示,传输文件即可。 [root@ss-server ~] # curl -F "filename=@/data/www/test.tar.gz" http://localhost:9090/action.php [root@ss-server ~] # curl localhost:8000/api/v1/upimg -F "file=@/Users/fungleo/Downloads/401.png" -H "token: 222" -v 如果使用了-F参数,curl就会以 multipart /form-data 的方式发送POST请求。 -F参数以name=value的方式来指定参数内容,如果是一个文件,则需要以name=@ file 的方式来指定。 如果通过代理,上面的命令有可能会被代理拒绝,这时需要指定上传文件的MIME媒体类型。命令如下: -x参数:在给定的端口上使用HTTP代理。相当于--proxy [root@ss-server ~] # curl -x kevin.com:1080 -F "filename=@/data/www/test.tar.gz;type=application/octet-stream" http://localhost:9090/action.php 此外,如果不上传文件,则可以使用 "-d" 参数,这时curl会以application /x-www-url-encoded 方式发送 POST 请求。命令如下: [root@ss-server ~] # url -d "action=del&name=archer" -d "id=12" http://localhost:9090/action.php |
4. curl常用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | ############ 常规访问 ############ # curl http://www.baidu.com ############ 文件名正则 ############ # curl ftp://ftp.baidu.cn/file[1-100].txt # curl ftp://ftp.baidu.cn/file[001-100].txt # curl ftp://ftp.baidu.cn/file[a-z].txt # curl ftp://ftp.baidu.cn/file[a-z:2].txt ############ 域名正则 ############ # curl http://site.{one,two,three}.com ############ 目录正则 ############ # curl http://www.baidu.com/archive[1996-1999]/vol[1-4]/part{a,b,c}.html ############ 常规下载页面 ############ # curl -o index.html http://www.baidu.com/ # curl http://www.baidu.com/ > index.html ############ 添加下载进度条 ############ # curl -# http://www.baidu.com/ > index.html # curl --progress http://www.baidu.com/ > index.html # curl --progress-bar http://www.baidu.com/ > index.html ############ 使用不同的版本的http协议 ############ 默认1.0版本 # curl -0 http://www.baidu.com 指定版本 # curl --http1.1 http://www.baidu.com # curl --http2 http://www.baidu.com ############ 使用不同的ssl版本访问 ############ tlsv1 # curl -1 http://www.baidu.com # curl --tlsv1 http://www.baidu.com sslv2 # curl -2 http://www.baidu.com # curl --sslv2 http://www.baidu.com sslv3 # curl -3 http://www.baidu.com # curl --sslv3 http://www.baidu.com ############ 使用不同的ip协议 ############ ipv4 # curl -4 http://www.baidu.com # curl --ipv4 http://www.baidu.com ipv6 # curl -6 http://www.baidu.com # curl --ipv6 http://www.baidu.com ############ 指定user-agent ############ # curl -A "wget/1.0" http://www.baidu.com # curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" http://www.baidu.com # curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" http://www.baidu.com ############ 指定cookie ############ # curl -b "phpsession=Testtest" http://www.baidu.com # curl --cookie "name=Daniel" http://www.baidu.com ############ 指定cookie文件 ############ # curl -c cookies.txt http://www.baidu.com # curl --cookie-jar cookies.txt http://www.baidu.com ############ 提交post数据 ############ # curl -d "username=admin&password=pass" http://www.baidu.com # curl --data "birthyear=1905&press=%20OK%20" http://www.baidu.com/when.cgi # curl --data-urlencode "name=I am Daniel" http://curl.haxx.se # curl --data "<xml>" --header "Content-Type: text/xml" --request PROPFIND url.com ############ 指定referer ############ # curl -e "http://www.baidu.com/referer" http://www.baidu.com # curl --referer http://www.baidu.com/referer http://www.baidu.com ############ 指定header ############ # curl --header "Host:www.baidu.com" http://www.baidu.com ############ 显示访问网页的header ############ # curl -D - http://www.baidu.com # curl --dump-header headers_and_cookies http://www.baidu.com ############ 跟随location跳转页面 ############ # curl -L http://www.baidu.com # curl --location http://www.baidu.com ############ 指定dns访问网站 ############ # curl --dns-servers 8.8.8.8 http://www.baidu.com ############ 指定证书访问https的网页 ############ # curl --cert mycert.pem https://www.baidu.com ############################################################################################# 运维工作中常见的curl命令操作 ############################################################################################# 1)抓取页面内容到一个文件中 # curl -o home.html http://www.kevin.net/bobo218558 正则匹配下载,比如下载后的文件001-nick.JPG # curl -o #2_#1.jpg http://www.kevin.net/bobo218558/{zzh,nick}/[001-201].JPG 2)用-O,后面的url要具体到某个文件,不然抓不下来 # curl -O http://www.kevin.net/bobo218558/dd.jpg 3)模拟表单信息,模拟登录,保存cookie信息 # curl -c ./cookie_c.txt -F log=aaaa -F pwd=****** http://www.kevin.net/bobo218558 4)模拟表单信息,模拟登录,保存头信息 # curl -D ./cookie_D.txt -F log=aaaa -F pwd=****** http://www.kevin.net/bobo218558 -c(小写)产生的cookie和-D里面的cookie是不一样的。 5)使用cookie # curl -b ./cookie_c.txt http://www.kevin.net/bobo218558 # curl http://www.kevin.net/bobo218558 –cookie "user=root;pass=123456" 多个用;分开 6)断点续传,-C(大写的) # curl -C - https://www.baidu.com 7)传送数据,最好用登录页面测试,因为你传值过去后,curl回抓数据,你可以看到你传值有没有成功 # curl -d log=aaaa http://www.kevin.net/bobo218558 8)显示抓取错误。 # curl -f http://www.kevin.net/bobo218558 9)伪造来源地址,有的网站会判断,请求来源地址。 # curl -e http://www.kevin.net/bobo218558 http://www.kevin.net/bobo218558 10)当经常用curl去访问别人网址的时候,人家会把你的IP给屏蔽掉的,这个时候,我们可以用代理 # curl -x 24.10.28.84:32779 -o home.html http://www.kevin.net/bobo218558 11)比较大的东西,我们可以分段下载 # curl -r 0-100 -o img.part1 http://www.kevin.net/bobo218558 # ls |grep part | xargs du -sh 用的时候,把他们 cat 一下就OK了 # cat img.part* >img.jpg 12)不会显示下载进度信息(-s 等于 --silent) # curl -s -o aaa.txt https://www.baidu.com 13)显示下载进度条 # curl -# -O https://www.baidu.com/test.html 14)通过 ftp 下载文件 # curl -u 用户名:密码 -O http://www.kevin.net/bobo218558 或者用下面的方式 # curl -O ftp://用户名:密码@ip:port/demo/curtain/bbstudy_files/style.css 15)通过 ftp 上传 # curl -T test.sql ftp://用户名:密码@ip:port/demo/curtain/bbstudy_files/ 16)使用–limit-rate限制curl的下载速度 # curl http://www.kevin.com/har/test –limit-rate 50k 命令中用k(千字节)和m(兆字节)指定下载速度限制。 17) 使用--max-filesize指定可下载的最大文件大小 # curl http://www.kevin.com/har/test --max-filesize 10000 如果文件大小超出限制,命令则返回一个非0退出码,如果命令正常则返回0。 18)使用curl选项 -u 可以完成HTTP或者FTP的认证,可以指定密码,也可以不指定密码在后续操作中输入密码 # curl -u user:pwd http://www.kevin.net/bobo218558 # curl -u user http://www.kevin.net/bobo218558 19)通过-I或者- head 可以只打印出HTTP头部 # curl -I http://www.kevin.net/bobo218558 20)有些网站访问会提示只能使用IE浏览器来访问,这是因为这些网站设置了检查用户代理,可以使用curl把用户代理设置为IE,这样就可以访问了。 使用–user-agent或者-A选项 # curl http://********* --user-agent "Mozilla/5.0" # curl http://********* -A "Mozilla/5.0" 21)其他HTTP头部信息也可以使用curl来发送,使用-H "头部信息" 传递多个头部信息 # curl -H "Host:man.linuxde.net" -H "accept-language:zh-cn" http://*********** 以json 格式请求 # curl -H "Content-Type: application/json" -X POST --data '{"data":"1"}' http://127.0.0.1/ 22)一个服务器端常用的限制方法,就是检查http访问的referer。 比如你先访问首页,再访问里面所指定的下载页,这第二次访问的 referer地址就是第一次访问成功后的页面地址。 这样,服务器端只要发现对下载页面某次访问的referer地址不是首页的地址,就可以断定那是个盗链了。 curl给我们提供了设定referer的option: -e # curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 113.114.115.6:1080 -e "mail.linuxidc.com" -o page.html -D cookie0001.txt http://www.kevin.com 22)输出完成后自定义打印信息 # curl -w '{ "time_namelookup" : %{time_namelookup}, "time_connect" : %{time_connect}, "time_appconnect" : %{time_appconnect}, "time_pretransfer" : %{time_pretranfer}, "time_redirect" : %{time_redirect}, "time_starttransfer" : %{time_starttransfer}, "time_total" : %{time_total}, "speed_download" : %{speed_download}, "speed_upload" : %{speed_upload}, "remote_ip" : "%{remote_ip}" , "remote_port" : "%{remote_port}" , "local_ip" : "%{local_ip}" , "local_port" : "%{local_port}" } ' -D /tmp/tmpOUQ_P_ -o /tmp/tmpAUjoDh -s -S ' http: //www .kevin.net /bobo218558/search/universal/v2 ?m=s&query=is_list=1%26info_type=1%26info_source=1%26size=20' |
5. curl命令的超时时间
1 2 3 4 5 6 7 8 9 10 11 | curl命令有两个超时时间:一个是连接超时时间,另一个是整个过程允许的最大时间! --connect-timeout <seconds> 这个是指定连接超时时间。 如果出错, 提示形如:curl: (28) connect() timed out! 比如命令 "curl --connect-timeout 10 ......" -m /--max-time <seconds> 这个是指定整个过程最大的允许时间。 出错提示如:curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received! 比如命令 "curl -m 60 ......." 除此之外,curl命令还可以这样使用: # curl -o kevin.log "http://www.ru.com" --speed-time 5 --speed-limit 1 表示将url内容保存到kevin.log中, 如果传输速度小于1字节/秒的状态持续5秒,该连接就会终止. |
二、Curl的GET、POST、PUT、DELETE请求
1. GET、POST、PUT、DELETE含义与区别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | ############ 简单的来理解 ############ GET /uri/xxx 查看(相当于数据库中的 select 操作),即通过请求URL获得资源。 PUT /uri/xxx 更新/创建(相当于数据库中的update操作),即通过请求URL修改某个内容。 POST /uri 创建 (相当于数据库中的insert操作),即通过请求URL添加新的资源,用于表单提交。 DELETE /uri/xxx 删除 (相当于数据库中的delete操作),即通过请求URL删除某个内容。 ############ 含义 ############ 1)GET请求:得到或查看数据 GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的 select 操作一样,只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容。 也就是说GET请求不会产生副作用。无论进行多少次操作,结果都是一样的。 2)PUT请求:在已经存在的数据上更新数据 与GET请求不同的是,PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等。 也就是说无论进行多少次PUT操作,其结果并没有不同。 3)POST请求:创建数据 POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。 几乎目前所有的提交操作都是默认用POST请求的。 4)DELETE请求:删除数据 DELETE请求顾名思义,就是用来删除某一个资源的,该请求就像数据库的delete操作。 ############ 安全性方面 ############ 1)GET请求的操作是安全的。 所谓安全是指不管进行多少次操作,资源的状态都不会改变。比如用GET请求方式浏览文章,不管浏览多少次,那篇文章还在那,没有变化。 当然有人可能会说每浏览一次文章,文章的浏览数就增加一次,这不也改变了资源的状态么。 其实这并不矛盾,因为这个改变不是GET操作引起的,而是用户自己设定的服务端逻辑造成的。 2)PUT,DELETE请求的操作是幂等的。 所谓幂等:是指无论进行多少次重复操作,都是实现相同的结果。也就是说若输入相同的参数执行任意次结果相同,则为等幂操作!!!! 比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同,DELETE也是一样。 顺便说一句,因为GET操作是安全的,所以它自然也是幂等的。 3)POST操作既不是安全的,也不是幂等的 比如常见的POST重复加载问题:当多次发出同样的POST请求后,其结果是创建出了若干的资源。 4)安全和幂等的意义在于: 当操作没有达到预期的目标时,我们可以不停的重试,而不会对资源产生副作用。从这个意义上说,POST操作往往是有害的,但很多时候我们还是不得不使用它。 5)需要注意事项 创建操作可以使用POST请求,也可以使用PUT请求!区别在于: POST 是作用在一个集合资源之上的( /uri ),而PUT操作是作用在一个具体资源之上的( /uri/xxx )。 再通俗点说,如果URL可以在客户端确定,那么就使用PUT请求,如果是在服务端确定,那么就使用POST请求。 比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST请求方法了。 所以,简单总结下: GET,POST,PUT都是幂等性操作,而POST不是幂等性操作; GET:不管对资源查询多少次,此实现都是一样的 PUT:将A第一次修改成B,再进行多次操作,最终结果还是还算B,与第一次写的结果是一样的,所有PUT是 DELETE:第一次把资源删除以后,后面进行多少次操作都算资源被删除 POST: 不是,因为一次请求添加一份新的资源,二次请求是乎产生不同的结 ############ 区别 ############ 1)GET请求 和 POST请求 从字面意思就可以看出两者区别,一个是GET(获取),一个是POST(发送)。 GET方法的请求用来告诉服务器需要获取哪些内容(uri+query),向静态页面(uri)请求则直接返回文件内容给浏览器,向一个动态页面请求时可以 提供查询参数(query)以获得相应内容。 POST方法的请求用来向服务器提交内容,主要是为了提交,而不是为了请求内容,就是说POST的初衷并不要求服务器返回内容,只是提交内容让服务器 处理(主要是存储或者处理之后再存储)。 2)PUT请求 和 POST请求 PUT请求主要作用在一个具体资源之上的(即uri /xxx ),POST请求主要作用在一个集合资源之上的(即uri) 就是说,如果URL可以在客户端确定就使用PUT请求,如果URL在服务端确定就使用POST请求。 PUT请求和POST请求容器混淆的就是它们都可以修改数据。它们的区别在于是否等幂:PUT请求是等幂操作,而POST请求是不等幂操作。 所以POST方式每执行一次会增加一条数据,而PUT请求是在已经存在的数据上进行修改。 也就是说POST方式一般用于增加数据,POST方式用于修改已有数据。 |
2. GET、POST、PUT、DELETE四种请求方式的curl访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | - v 显示请求的信息 -X 选项指定其它协议 GET请求方式 # curl -v 172.16.60.21:8080/caijin/age/18 POST请求方式 # curl -v 172.16.60.21:8080/caijin -d 'age=14&cupSize=C' # curl -v -X POST 172.16.60.21:8080/caijin -d 'age=14&cupSize=C' PUT请求方式 # curl -v -X PUT -d "age=19&cupSize=C" 172.16.60.21:8080/caijin/3 # curl -X PUT --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{"message":"aaaa","exchange_id":"123" }' 'http://localhost:9090/service/record' DELETE请求方式 # curl -v -X DELETE 172.16.60.21:8080/caijin/3 |
*************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步