|
6 J6 D; z/ o% N9 P7 c9 s 为什么要使用curl命令?curl命令可以帮助我们在linux服务内部通讯,排查接口是否能够正确调用,外网的接口是否有防火墙限制,内网的请求可以快速帮我们获取接口参数返回,并且调试程序代码,在局域网,或者内网的时候只能在内网调试,这个时候curl命令足以支持我们完成所有调试和测试。 $ t$ j3 u0 E# h" I* G
curl 能做什么?这是官网的介绍:记住学习一个技术一定要看官网的文档和介绍,不要一上手就去百度,百度只会让你成为一个基础的代码搬运工,要养成去官网看文档的习惯curl官网:https://curl.se/docs/httpscripting.html。
; I2 }1 g9 T1 {& d# O C A) E N 下面引用下官网的脚本介绍和使用:使用 Curl 编写 HTTP 请求脚本的艺术背景本文档假定您熟悉 HTML 和一般网络越来越多的应用程序迁移到 Web 使得“HTTP 脚本”的请求和需求更加频繁能够自动从网络中提取信息、伪造用户、向网络服务器发布或上传数据都是当今重要的任务。 1 a- v% }+ j" C }$ l
Curl 是一个用于执行各种 URL 操作和传输的命令行工具,但本文档将重点介绍如何在执行 HTTP 请求时使用它以获取乐趣和利润我将假设您知道如何调用curl --help或curl --manual获取有关它的基本信息。 0 J! \# q5 K" s' Y, Q& A; m" j4 L
Curl 并不是为你做所有事情它发出请求,获取数据,发送数据并检索信息您可能需要使用某种脚本语言或重复的手动调用将所有内容粘合在一起HTTP 协议HTTP 是用于从 Web 服务器获取数据的协议它是一个建立在 TCP/IP 之上的简单协议。 0 a1 j/ Z" M- N
该协议还允许使用几种不同的方法将信息从客户端发送到服务器,如下所示HTTP 是由客户端发送到服务器以请求特定操作的纯 ASCII 文本行,然后服务器在实际请求的内容发送到客户端之前回复几行文本客户端 curl 发送一个 HTTP 请求。 4 r; Z0 j( s3 w: P3 \
请求包含一个方法(如 GET、POST、HEAD 等)、许多请求标头,有时还包含一个请求正文HTTP 服务器以状态行(指示事情是否顺利)、响应标头以及最常见的响应正文进行响应“body”部分是您请求的纯数据,例如实际的 HTML 或图像等。 1 ^3 E/ F" u* o& \7 M& R
见协议使用 curl 的选项--verbose(-v作为一个简短的选项)将显示 curl 发送到服务器的命令类型,以及一些其他信息文本--verbose是调试甚至理解 curl 服务器交互是最有用的选项。 ; [- s# U& N' o) H# @
有时甚至--verbose是不够的然后提供更多细节,因为它们显示了--tracecurl发送和接收的所有内容像这样使用它:--trace-asciicurl --trace-ascii debugdump.txt http://www.example.com/。 . c. A }3 X% E& a
看时间很多时候,您可能想知道到底是什么时间,或者您只想知道传输中两点之间的毫秒数对于这些情况以及其他类似情况,--trace-time您需要选择该选项它会将时间添加到每个跟踪输出行:curl --trace-ascii d.txt --trace-time http://example.com/。
+ L: n3 E! h# L& B" f! |5 N 查看响应默认情况下 curl 将响应发送到标准输出您需要将其重定向到某个地方以避免这种情况,通常是使用 -oor完成的-O网址规格统一资源定位符格式是您指定 Internet 上特定资源地址的方式你知道这些,你已经看过像https://curl.se或https://yourbank.com这样的 URL一百万次。 2 ^4 W: v0 ?. f
RFC 3986 是规范规范是的,正式名称不是 URL,而是 URI主持人主机名通常使用 DNS 或 /etc/hosts 文件解析为 IP 地址,这就是 curl 将与之通信的内容或者,您可以直接在 URL 中指定 IP 地址而不是名称。 5 `& Q ?$ Y& C7 Y6 l" l8 T
对于开发和其他尝试情况,您可以使用 curl 的--resolve选项为主机名指向不同的 IP 地址,而不是其他情况下使用的 IP 地址:curl --resolve www.example.org:80:127.0.0.1 http://www.example.org/ : \8 d) \4 Z6 h3 G
端口号curl 支持的每个协议都在默认端口号上运行,无论是通过 TCP 还是在某些情况下是 UDP通常您不必考虑这一点,但有时您会在其他端口或类似端口上运行测试服务器然后,您可以在 URL 中使用冒号和紧跟主机名的数字指定端口号。 8 J2 ]$ v6 X% ~2 H% ]
就像对端口 1234 执行 HTTP 时一样:curl http://www.example.org:1234/您在 URL 中指定的端口号是服务器用来提供其服务的端口号有时您可能会使用代理,然后您可能需要将代理的端口号与 curl 连接到服务器所需的端口号分开。 " d7 u o8 Y G
就像在端口 4321 上使用 HTTP 代理一样:curl --proxy http://proxy.example.org:4321 http://remote.example.org/用户名和密码某些服务设置为需要 HTTP 身份验证,然后您需要提供名称和密码,然后根据使用的确切身份验证协议以各种方式将其传输到远程站点。
! k' x, J7 v& Z! y; p; \ 您可以选择在 URL 中插入用户名和密码,也可以单独提供:curl http://user:password@example.org/或者curl -u user:password http://example.org/
# I" j" g2 U7 ?# C) \ 您需要注意的是,这种 HTTP 身份验证并不是当今面向用户的网站通常所做的和要求的他们倾向于使用表格和cookies路径部分路径部分只是被发送到服务器以请求它发回相关的响应路径是在主机名和可能的端口号后面的斜杠右侧的内容。
: G6 x8 w! d7 ^6 D' E 获取页面得到使用 HTTP 进行的最简单和最常见的请求/操作是获取 URLURL 本身可以引用网页、图像或文件客户端向服务器发出 GET 请求并接收它请求的文档如果您发出命令行curl https://curl.se。 4 B2 s# C; {1 @% g
您会在终端窗口中返回一个网页该 URL 包含的整个 HTML 文档所有 HTTP 回复都包含一组通常隐藏的响应头,使用 curl 的--include( -i) 选项来显示它们以及文档的其余部分头--head您可以使用( ) 选项仅向远程服务器询问标头,-I这将使 curl 发出 HEAD 请求。 & w7 k/ W, }& f/ d7 B: w
在某些特殊情况下,服务器拒绝 HEAD 方法,而另一些仍然有效,这是一种特殊的烦恼HEAD 方法的定义和制作使得服务器返回的标题与它对 GET 所做的完全一样,但没有正文这意味着您可能会Content-Length:在响应标头中看到 a,但在 HEAD 响应中不能有实际的正文。 - i% S$ O; ~: f
单个命令行中的多个 URL单个 curl 命令行可能涉及一个或多个 URL最常见的情况可能是只使用一个,但您可以指定任意数量的 URL是的,任何无限然后,您将收到针对所有给定 URL 的重复请求例如,发送两个 GET:
: `7 j. U X7 f. n# ? curl http://url1.example.com http://url2.example.com如果您使用--dataPOST 到 URL,则使用多个 URL 意味着您将相同的 POST 发送到所有给定的 URL。 3 R6 k5 S" |% a5 j/ {/ {9 q
例如,发送两个 POST:curl --data name=curl http://url1.example.com http://url2.example.com单个命令行中的多个 HTTP 方法有时您需要在一个命令行中对多个 URL 进行操作,并对每个 URL 执行不同的 HTTP 方法。 D/ @0 U% {# {4 T$ v, j2 _
为此,您将享受该--next选项它基本上是一个分隔符,将一堆选项与下一个选项分开之前的所有 URL--next都将获得相同的方法,并将所有 POST 数据合并为一个当 curl--next在命令行上到达时,它将重置方法和 POST 数据并允许新的设置。
1 X2 p6 j: K7 C+ r' L2 r 也许最好用几个例子来说明这一点要先发送一个 HEAD,然后再发送一个 GET:curl -I http://example.com --next http://example.com要先发送 POST,然后再发送 GET:。
6 [) e: H) \: Q! P' o curl -d score=10 http://example.com/post.cgi --next http://example.com/results.htmlHTML 表单表格解释表单是网站呈现 HTML 页面的一般方式,其中包含供用户输入数据的字段,然后按某种“确定”或“提交”按钮将该数据发送到服务器。 ; G( x" @/ U! S- M+ L
然后服务器通常使用发布的数据来决定如何行动就像使用输入的词在数据库中搜索,或在错误跟踪系统中添加信息,在地图上显示输入的地址或使用信息作为登录提示验证用户是否可以查看它的内容查看当然,服务器端必须有某种程序来接收您发送的数据。 8 u7 ]' [. |8 r
你不能凭空发明一些东西得到GET-form 使用 GET 方法,如 HTML 中指定的那样:
2 p2 a$ R( G2 q- e2 B1 r 在您喜欢的浏览器中,此表单将显示一个文本框以供填写,并带有一个标有“确定”的按钮如果您填写“1905”并按 OK 按钮,您的浏览器将创建一个新的 URL 来为您获取该 URL 将junk.cgi?birthyear=1905&press=OK附加到前一个 URL 的路径部分。 # X% ~+ {( J6 b- N- C% W% ]
如果在页面上看到原始表单www.example.com/when/birth.html,您将获得的第二页将变为www.example.com/when/junk.cgi?birthyear=1905&press=OK。 y7 o/ }1 b7 y5 Q0 K& k6 P. t
大多数搜索引擎都是这样工作的要让 curl 为您发送 GET 表单,只需输入预期的创建 URL:curl "http://www.example.com/when/junk.cgi?birthyear=1905&press=OK"。 4 {2 p6 S# V: P; I% m1 M
邮政GET 方法使所有输入字段名称都显示在浏览器的 URL 字段中当您希望能够使用给定数据为该页面添加书签时,这通常是一件好事,但如果您在其中一个字段中输入了秘密信息,或者如果有大量字段创建了一个长且不可读的网址。 1 y/ x6 q/ C* Q$ v5 B- D6 ~/ U
然后 HTTP 协议提供 POST 方法这样,客户端发送的数据与 URL 分开,因此您不会在 URL 地址字段中看到任何数据该表单看起来与前一个类似:。
9 p9 w2 b: k& q/ R 并且要使用 curl 来发布此表单,并填写与以前相同的数据,我们可以这样做:curl --data "birthyear=1905&press=%20OK%20" http://www.example.com/when/junk.cgi : o r5 R/ h# ^) j! A8 P9 U
这种 POST 将使用 Content-Typeapplication/x-www-form-urlencoded并且是使用最广泛的 POST 类型您发送到服务器的数据必须已经正确编码,curl 不会为您这样做。 . S1 }/ A+ V! N. H
例如,如果您希望数据包含一个空格,则需要将该空格替换为%20等不遵守此规定很可能会导致您的数据被错误接收并弄乱最近的 curl 版本实际上可以为您对 POST 数据进行 url 编码,如下所示:curl --data-urlencode "name=I am Daniel" http://www.example.com
" n# l( [6 {0 x, D0 I, U 如果您--data在命令行上重复多次,curl 将连接所有给定的数据段 - 并&在每个数据段之间放置一个符号文件上传 POST早在 1995 年末,他们就定义了另一种通过 HTTP 发布数据的方式它记录在 RFC 1867 中,为什么这种方法有时被称为 RFC1867-posting。
6 t- `3 z5 Z8 e5 p& |3 W 该方法主要是为了更好地支持文件上传而设计的允许用户上传文件的表单可以用 HTML 编写如下:。
* q- _: M+ D/ E; M Y W 这清楚地表明即将发送的 Content-Type 是multipart/form-data. " C% H, K! ~8 D( W$ `5 G a" E& o, M
要使用 curl 发布到这样的表单,请输入如下命令行:curl --form upload=@localfilename --form press=OK [URL]隐藏字段基于 HTML 的应用程序在页面之间传递状态信息的常用方法是向表单添加隐藏字段。
- y; ~+ {3 y) y+ R 隐藏字段已经填写,它们不会显示给用户,它们会像所有其他字段一样被传递具有一个可见字段、一个隐藏字段和一个提交按钮的类似示例表单可能如下所示: / s" H9 z/ k+ u0 q8 f
要使用 curl 发布此内容,您无需考虑字段是否隐藏卷曲它们都是一样的:curl --data "birthyear=1905&press=OK&person=daniel" [URL]。 ) O' J# w* F) `& Y) v$ H1 t
弄清楚 POST 的样子当您要填写表单并使用 curl 而不是浏览器将其发送到服务器时,您当然有兴趣完全按照浏览器的方式发送 POST一个简单的查看方法是将带有表单的 HTML 页面保存在本地磁盘上,将“方法”修改为 GET,然后按提交按钮(如果需要,您也可以更改操作 URL) .。 ; r7 q3 S' l8 m4 o
然后,您将清楚地看到数据被附加到 URL 中,并用 -?字母分隔,因为 GET 表单应该如此HTTP 上传放也许将数据上传到 HTTP 服务器的最佳方式是使用 PUT话又说回来,这当然需要有人在知道如何接收 HTTP PUT 流的服务器端放置一个程序或脚本。 . W! D4 O/ p6 _* u
使用 curl 将文件放入 HTTP 服务器:curl --upload-file uploadfile http://www.example.com/receive.cgiHTTP 身份验证基本认证HTTP 身份验证能够告诉服务器您的用户名和密码,以便它可以验证您是否被允许执行您正在执行的请求。
0 g5 t/ `& F) u/ h! d HTTP 中使用的基本身份验证(默认情况下 curl 使用的类型)是基于纯文本的,这意味着它发送的用户名和密码只是稍微混淆,但仍然可以被任何在你和远程服务器之间的网络上嗅探的人完全读取告诉 curl 使用用户和密码进行身份验证:
: B) l1 E6 M0 K: Y curl --user name:password http://www.example.com其他认证该站点可能需要不同的身份验证方法(检查服务器返回的标头),然后--ntlm, --digest,--negotiate甚至--anyauth可能是适合您的选项。 ( C/ z8 b* b, `! a5 G4 u4 G; {
代理身份验证有时您的 HTTP 访问只能通过使用 HTTP 代理获得这似乎在各个公司中尤为常见HTTP 代理可能需要自己的用户名和密码才能允许客户端访问 Internet要使用 curl 指定那些,请运行以下命令:。 : o3 B( Y/ h/ H3 n+ \- i
curl --proxy-user proxyuser:proxypassword curl.se如果您的代理需要使用 NTLM 方法完成身份验证,请使用--proxy-ntlm,如果它需要 Digest 使用--proxy-digest。
* k2 |% S/ `6 \: ]8 s 如果您使用这些用户+密码选项中的任何一个,但省略了密码部分,curl 将交互提示输入密码隐藏凭据请注意,当程序运行时,在列出系统正在运行的进程时,可能会看到它的参数因此,如果您将密码作为纯命令行选项传递,其他用户可能会看到您的密码。 6 M5 k3 u4 W+ S! d
有办法规避这一点值得注意的是,虽然这是 HTTP 身份验证的工作方式,但许多网站在提供登录等时不会使用此概念有关详细信息,请参阅下面的 Web 登录章节更多 HTTP 标头推荐人HTTP 请求可能包含一个“referer”字段(是的,它拼写错误),可用于判断客户端从哪个 URL 获取到该特定资源。
, e* a7 X9 l( V3 I t2 ^ 一些程序/脚本会检查请求的引用字段,以验证这不是来自外部站点或未知页面虽然这是一种检查容易伪造的东西的愚蠢方法,但许多脚本仍然这样做使用 curl,您可以在引用字段中放入任何您想要的内容,从而更容易欺骗服务器为您的请求提供服务。
8 M6 \) Z+ H& p+ r% n- A 使用 curl 设置引用字段:curl --referer http://www.example.come http://www.example.com用户代理与referer 字段类似,所有HTTP 请求都可以设置User-Agent 字段。 ) V o" j6 T( ?1 l4 I
它命名正在使用的用户代理(客户端)许多应用程序使用此信息来决定如何显示页面愚蠢的网络程序员试图为不同浏览器的用户制作不同的页面,以使它们看起来最适合他们的特定浏览器他们通常也做不同类型的 JavaScript、VBScript 等。
5 ^ _2 H9 b p" M' \0 X2 u 有时,您会看到使用 curl 获取页面不会返回您在使用浏览器获取页面时看到的相同页面然后你知道是时候设置用户代理字段来欺骗服务器,让服务器认为你是那些浏览器之一要使 curl 在 Windows 2000 机器上看起来像 Internet Explorer 5:。 0 m; D0 _5 {% x+ y& r$ c2 r
curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL]或者为什么不看起来像在旧的 Linux 机器上使用 Netscape 4.73: * K% R5 F; N4 J3 V4 F3 }5 S% y7 O) s
curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]重定向位置标头当从服务器请求资源时,来自服务器的回复可能包括关于浏览器下一步应该去哪里找到该页面的提示,或者一个新页面保留新生成的输出。 5 ~7 k8 `' f- P( [3 S8 h( ^4 v: J
告诉浏览器重定向的标头是Location:.默认情况下, Curl 不跟随Location:标头,而是以与显示所有 HTTP 回复相同的方式简单地显示此类页面但是,它确实具有一个选项,可以使它尝试跟随Location:指针。 2 {1 M2 F3 L& q A; e
告诉 curl 跟随一个位置:curl --location http://www.example.com如果您使用 curl 发布到一个立即将您重定向到另一个页面的站点,您可以安全地使用--location( -L) 和--data/--form一起。
6 T$ n6 |3 T* }/ J Curl 只会在第一个请求中使用 POST,然后在以下操作中恢复为 GET其他重定向浏览器通常支持至少两种 curl 不支持的其他重定向方式:首先,html 可能包含一个元刷新标签,要求浏览器在设定的秒数后加载特定的 URL,或者它可能使用 JavaScript 来完成。
; C" w6 I; ^/ q t, V; H/ t+ t 饼干饼干基础Web 浏览器执行“客户端状态控制”的方式是使用 cookieCookie 只是带有相关内容的名称cookie 由服务器发送给客户端服务器告诉客户端它想要返回 cookie 的路径和主机名,它还发送一个过期日期和更多属性。
' U7 [6 T: e8 k8 W 当客户端使用先前在接收到的 cookie 中指定的名称和路径与服务器通信时,客户端将 cookie 及其内容发送回服务器,当然除非它们已过期许多应用程序和服务器使用此方法将一系列请求连接到单个逻辑会话中。 # N* K* f* Q8 j/ P& r
为了能够在这种情况下使用 curl,我们必须能够以 Web 应用程序期望的方式记录和发送回 cookie浏览器处理它们的方式相同饼干选项使用 curl 获取页面时向服务器发送一些 cookie 的最简单方法是在命令行中添加它们,例如: 6 } c$ t! @# u
curl --cookie "name=Daniel" http://www.example.comCookies 作为常见的 HTTP 标头发送这是实用的,因为它允许 curl 仅通过记录标题来记录 cookie。
1 \; w5 [( j4 k- m, a 使用--dump-header( -D) 选项使用 curl 记录 cookie,例如:curl --dump-header headers_and_cookies http://www.example.com
: j: T8 _" g$ v8 G* B6 q# t (请注意,--cookie-jar下面描述的选项是存储 cookie 的更好方法)如果您想重新连接到服务器并使用从先前连接中存储的 cookie(或手动制作以欺骗服务器相信您有先前的连接,Curl 内置了一个完整的 cookie 解析引擎,则可以使用该引擎)。
* F. B1 n0 g$ t, s8 O 要使用以前存储的 cookie,您可以运行 curl,如下所示:curl --cookie stored_cookies_in_file http://www.example.com--cookie当您使用该选项时,Curl 的“cookie 引擎”将被启用。
+ i1 [' d' @) m! h9 x5 Z) x# M 如果您只想让 curl 了解收到的 cookie,请使用--cookie不存在的文件例如,如果你想让 curl 理解来自页面的 cookie 并跟踪一个位置(因此可能会发回它收到的 cookie),你可以像这样调用它:。 : g0 a! O- m2 t0 ]
curl --cookie nada --location http://www.example.comCurl 能够读取和写入使用 Netscape 和 Mozilla 曾经使用的相同文件格式的 cookie 文件。 z# [5 J/ d9 w* q+ U, a
这是在脚本或调用之间共享 cookie 的便捷方式( --cookie)-b开关自动检测给定文件是否是这样的 cookie 文件并对其进行解析,并且通过使用--cookie-jar( -c) 选项,您将使 curl 在操作结束时写入一个新的 cookie 文件:。
, U! s Z/ y* L; N8 [: z& G6 \ curl --cookie cookies.txt --cookie-jar newcookies.txt http://www.example.comHTTPSHTTPS 是 HTTP 安全的有几种方法可以进行安全的 HTTP 传输。
# c; ]5 S2 l0 o/ Z3 c: t# m 到目前为止,最常用的协议是通常称为 HTTPS、HTTP over SSL 的协议SSL 对通过网络发送和接收的所有数据进行加密,从而使攻击者更难窥探敏感信息SSL(或称为该标准的最新版本的 TLS)提供了大量高级功能,以允许加密 HTTP 所需的所有加密和关键基础设施机制。 0 j2 i0 j6 z3 d6 o
当构建使用 TLS 库时,Curl 支持加密提取,并且可以构建它以使用相当大的一组库中的curl -V一个 - 将显示您的 curl 是为使用哪个库而构建的(如果有的话!)要从 HTTPS 服务器获取页面,只需运行 curl,如下所示:。
; d" K# o/ G5 ]; ]9 D) x curl https://secure.example.com证书在 HTTPS 世界中,您使用证书来验证您是您声称的那个人,作为普通密码的补充Curl 支持客户端证书所有证书都使用密码锁定,您需要输入密码才能让 curl 使用证书。
( W M5 j# ]2 [3 U 密码短语可以在命令行中指定,如果没有,则在 curl 查询时以交互方式输入在 HTTPS 服务器上使用带有 curl 的证书,例如:curl --cert mycert.pem https://secure.example.com - u, w+ n1 G7 F6 y, F$ m
curl 还尝试通过根据本地存储的 CA 证书包验证服务器的证书来验证服务器是否是它声称的身份验证失败将导致 curl 拒绝连接然后您必须使用--insecure( -k) 以防您想告诉 curl 忽略无法验证服务器。 ( p" ]6 O- _$ Q w' X6 e
有关服务器证书验证和 ca 证书捆绑的更多信息,请参阅SSLCERTS 文档有时您可能会得到自己的 CA 证书存储,然后您可以告诉 curl 使用它来验证服务器的证书:curl --cacert ca-bundle.pem https://example.com/。
8 O2 O U6 O- b! P' B 自定义请求元素修改方法和标头做一些花哨的事情,您可能需要添加或更改单个 curl 请求的元素例如,您可以将 POST 请求更改为 PROPFIND 并将数据发送为Content-Type: text/xml(而不是默认的 Content-Type),如下所示:。 1 H. D& k5 w) ]' G- c" M; @
curl --data "" --header "Content-Type: text/xml" --request PROPFIND example.com您可以通过提供没有内容的默认标题来删除默认标题。
6 J* E# x3 ]8 V 就像您可以通过切断 Host: 标头来破坏请求一样:curl --header "Host:" http://www.example.com您可以以相同的方式添加标题您的服务器可能需要一个Destination:标头,您可以添加它:。
/ \) Y% R. q+ k8 n+ M4 y0 } curl --header "Destination: http://nowhere" http://example.com更多关于改变方法需要注意的是,curl 根据请求的操作自行选择使用哪些方法-d会做 POST,-I会做 HEAD 等等。
2 s8 u' F" w) t7 u, v! X 如果使用--request/-X选项,您可以更改 curl 选择的方法关键字,但不会修改 curl 的行为这意味着如果您例如使用 -d "data" 进行 POST,您可以将方法修改为PROPFINDwith-X并且 curl 仍会认为它发送 POST 。
: _; a$ p1 S) R+ P- ^' h -X POST您可以通过简单地添加如下命令行将普通 GET 更改为 POST 方法:curl -X POST http://example.org/...但是 curl 仍然会像发送 GET 一样思考和行动,因此它不会发送任何请求正文等。 # b$ j8 O. V2 E( O- ^% V" `+ A* V# `
网页登录一些登录技巧虽然不仅仅是与 HTTP 相关,但它仍然会给很多人带来问题,所以这里是关于绝大多数登录表单如何工作以及如何使用 curl 登录到它们的执行概要还可以注意到,要以自动化方式正确执行此操作,您肯定需要编写脚本并执行多个 curl 调用等。 ( A4 `. f, V* L, r& s) m+ F
首先,服务器主要使用 cookie 来跟踪客户端的登录状态,因此您需要捕获在响应中收到的 cookie然后,许多网站还在登录页面上设置了一个特殊的 cookie(以确保您通过他们的登录页面到达那里),因此您应该养成首先获取登录表单页面以捕获那里设置的 cookie 的习惯。
7 Q. u8 Z3 ~* h8 K7 x# f7 c 一些基于 Web 的登录系统具有不同数量的 JavaScript,有时它们使用此类代码来设置或修改 cookie 内容可能他们这样做是为了防止编程登录,就像本手册描述了如何......无论如何,如果阅读代码不足以让您手动重复该行为,那么捕获浏览器完成的 HTTP 请求并分析发送的 cookie 通常是一种工作方法,用于解决如何缩短 JavaScript 所需的时间。
- j0 K0 |$ ]8 o u3 { 在登录的实际标签中,许多网站填写随机/会话或其他秘密生成的隐藏标签,您可能需要先捕获登录表单的 HTML 代码并提取所有隐藏字段才能正确执行登录 POST请记住,在普通 POST 中发送时,内容需要进行 URL 编码。
$ D* M2 t8 D' H8 u 调试一些调试技巧很多时候,当您在站点上运行 curl 时,您会注意到该站点对您的 curl 请求的响应方式似乎与它对浏览器的响应方式不同然后你需要开始让你的 curl 请求更类似于浏览器的请求:使用该--trace-ascii选项来存储请求的完整详细日志,以便于分析和更好地理解。 9 [" u( {% d ~ f; A
确保在需要时检查并使用 cookie(阅读--cookie和写作--cookie-jar)将 user-agent (with -A) 设置为一个,就像最近流行的浏览器一样-E像浏览器设置的那样设置引用者(带) 7 y n) h8 s" T
如果您使用 POST,请确保以与浏览器相同的顺序发送所有字段检查浏览器的功能确保您正确执行此操作的一个好帮手是 Web 浏览器的开发人员工具,可让您查看您发送和接收的所有标头(即使使用 HTTPS)更原始的方法是使用 Wireshark 或 tcpdump 等工具捕获网络上的 HTTP 流量,并检查浏览器发送和接收的标头。
6 z; M' L$ X' z (HTTPS 强制您使用它SSLKEYLOGFILE来执行此操作)参数帮助命令:[root@master ~]# curl -h! g& \1 A3 i# P: U: _
8 m" P7 z, t v Usage: curl [options...]
# o0 z# S0 I7 L& |9 T( a- h$ D( }* a
Options: (H) means HTTP/HTTPS only, (F) means FTP only2 e) J, z# _' k# q4 ~: |
1 I" t& z$ |4 v& E4 M: f* t# g
) ?5 i9 C8 @! z --anyauth Pick "any" authentication method (H)
! A( n6 |( P8 r# A8 m5 U, A- N' r3 o$ F6 W$ w+ ]& l. A
-a, --append Append to target file when uploading (F/SFTP)
; o- m. ^2 t3 Z" X, a5 t, S --basic Use HTTP Basic Authentication (H)--cacert FILE CA certificate to verify peer against (SSL)--capath DIR CA directory to verify peer against (SSL)
+ F- S* c; K; ]( u! G2 Q' S2 _% s) l- W 8 @ i% u& S$ [3 q
" n. f {; M; K -E, --cert CERT[ ASSWD] Client certificate file and password (SSL)--cert-type TYPE Certificate file type (DER/PEM/ENG) (SSL)
( Z6 W8 _% b6 S! B --ciphers LIST SSL ciphers to use (SSL)--compressed Request compressed response (using deflate or gzip)
J5 }5 M& x" b3 z( W% Z" Y 6 L- q8 [( J' u$ k& K
" I; Q. T1 d! J
-K, --config FILE Specify which config file to read--connect-timeout SECONDS Maximum time allowed for connection
% [2 f' f, k0 x3 r 1 Z) r/ F4 ]+ o g0 H
" u+ i9 \/ [, P: l2 L9 H$ G
-C, --continue-at OFFSET Resumed transfer offset: r5 O4 B5 ~2 z) M& h: _: p
' {5 R* R4 |3 k1 v( m2 U( \
-b, --cookie STRING/FILE String or file to read cookies from (H) 5 c3 ^$ b; h! Z; x* V
9 J1 [- [6 l: `8 r1 |2 W6 z4 T" F
; @$ Z7 g7 x7 q! l w
-c, --cookie-jar FILE Write cookies to this file after operation (H)--create-dirs Create necessary local directory hierarchy
# N2 P- J- A. g0 U, J, e# t8 L, l) r --crlf Convert LF to CRLF in upload--crlfile FILE Get a CRL list in PEM format from the given file( g9 _( ~. c6 I( n) H, `/ n
1 m4 S, m* x3 k C/ p -d,
% I" d3 g4 F S: \' C --data DATA HTTP POST data (H)--data-ascii DATA HTTP POST ASCII data (H)--data-binary DATA HTTP POST binary data (H)
1 S; E# c+ T5 q6 X --data-urlencode DATA HTTP POST data url encoded (H)--delegation STRING GSS-API delegation permission 1 k0 o( u4 j. W3 R
--digest Use HTTP Digest Authentication (H)--disable-eprt Inhibit using EPRT or LPRT (F)--disable-epsv Inhibit using EPSV (F)
: i1 F9 a+ K' B& |& S
, g8 G P# _: }1 _* b s2 z
- j7 `& V; T: c5 k! a/ q -D, --dump-header FILE Write the headers to this file--egd-file FILE EGD socket path for random data (SSL) 5 i6 Q5 y+ A: S
--engine ENGINGE Crypto engine (SSL). "--engine list" for list
% B, [% S( N; _4 n
Z; q/ f. m# [/ W& T/ ~. U -f, --fail Fail silently (no output at all) on HTTP errors (H) $ q+ {, {5 z: s7 M( r
N7 E K: p3 q* o, a6 |
2 n; t! \! b! j2 @
-F, --form CONTENT Specify HTTP multipart POST data (H)--form-string STRING Specify HTTP multipart POST data (H)
& g- ^! j, ?. U- U* i --ftp-account DATA Account data string (F)--ftp-alternative-to-user COMMAND String to replace "USER [name]" (F)
5 X0 C+ w' }! Y0 [) @ --ftp-create-dirs Create the remote dirs if not present (F)--ftp-method [MULTICWD/NOCWD/SINGLECWD] Control CWD usage (F)
% e: D0 k& J2 m" u, |+ @# _& L2 x --ftp-pasv Use PASV/EPSV instead of PORT (F)
5 A; S5 q+ R) @
& V: c7 p# e1 A& J. ]3 t -P, --ftp-port ADR Use PORT with given address instead of PASV (F) # p+ R- A! W ^1 j# B) l; [
--ftp-skip-pasv-ip Skip the IP address for PASV (F)--ftp-pret Send PRET before PASV (for drftpd) (F)--ftp-ssl-ccc Send CCC after authenticating (F) , R- K0 a- @) G* U; v" H, b
--ftp-ssl-ccc-mode ACTIVE/PASSIVE Set CCC mode (F)--ftp-ssl-control Require SSL/TLS for ftp login, clear for transfer (F)
6 v1 H# t# w g% k6 T& B' h ; D8 v" x/ M$ I/ c4 j
. A: P" C1 m4 i& a8 x5 |
-G, --get Send the -d data with a HTTP GET (H)
, X9 g+ l' _7 n$ c0 q: D6 e4 ?6 F$ H7 m% {% n: i
-g, --globoff Disable URL sequences and ranges using {} and []
4 p, w. A( u, H" }
" l- `" s/ X9 Q; c; ^6 c# F1 e D8 Y0 ?9 I: \
-H, --header LINE Custom header to pass to server (H)7 }6 K, u. E4 {/ N3 K2 T
' ]9 b+ v& N) `
-I, --head Show document info only1 j# { @) ?/ P+ i1 j3 Z
% Z+ V# ?( B6 a A1 s, V# c+ j9 f
-h, --help This help text , ]. o% e6 X) }! a( K N6 d( S& `$ K
--hostpubmd5 MD5 Hex encoded MD5 string of the host public key. (SSH)-0, --http1.0 Use HTTP 1.0 (H)--ignore-content-length Ignore the HTTP Content-Length header # I7 ^$ B+ w8 |& v6 J
$ u3 w( H% V0 V/ f$ d
1 M: V3 x; U! I6 a* V4 y/ Q/ ^
-i, --include Include protocol headers in the output (H/F)
+ \% V; G1 a6 E9 {: ]. A3 x- D1 W8 @7 D/ c/ o% X
-k, --insecure Allow connections to SSL sites without certs (H)
2 [+ y; t ]5 L4 D --interface INTERFACE Specify network interface/address to use-4, --ipv4 Resolve name to IPv4 address
4 n t1 P. C" J- q -6, --ipv6 Resolve name to IPv6 address
' M) h3 ]% R7 v ]" ~$ T5 A6 B& H n; R: I9 D$ w" \0 U
-j, --junk-session-cookies Ignore session cookies read from file (H) & C" Q8 P d/ e: [5 P, f
--keepalive-time SECONDS Interval between keepalive probes--key KEY Private key file name (SSL/SSH)--key-type TYPE Private key file type (DER/PEM/ENG) (SSL)
3 n# u) M; p8 w& Z* | --krb LEVEL Enable Kerberos with specified security level (F)--libcurl FILE Dump libcurl equivalent code of this command line
2 J* K+ ^& K* a% k --limit-rate RATE Limit transfer speed to this rate
1 O- p- U6 o/ U( _3 R, c& G9 S( Z) |! ?3 K) ?" w! ~+ }; _ ?9 _. Q
-l, --list-only List only names of an FTP directory (F) $ R% B) p' a! C ^/ H7 @$ c' X
--local-port RANGE Force use of these local port numbers1 d, z* S, a2 y8 _1 ^
$ L) `- u# p. X" E
-L, --location Follow redirects (H)--location-trusted like --location and send auth to other hosts (H) 0 ^& ?+ E; @' G# {- ]; \5 r
% y# m9 e& Z; n; U
0 a* k. M$ g8 H; s% Q
-M, --manual Display the full manual--mail-from FROM Mail from this address--mail-rcpt TO Mail to this receiver(s)
7 {. @" }; N5 y2 Q% v --mail-auth AUTH Originator address of the original email--max-filesize BYTES Maximum file size to download (H/F) 6 P p/ _2 }5 u! v) c0 b
--max-redirs NUM Maximum number of redirects allowed (H): }, Y3 B# O! }# n
& K! F# C( C: W8 P6 N: J -m, --max-time SECONDS Maximum time allowed for the transfer
, G. h3 Z; D5 @8 }/ c, ? --metalink Process given URLs as metalink XML file--negotiate Use HTTP Negotiate Authentication (H)& E# \8 s( o4 E: m3 [
/ Z% @- j1 \; h: X C+ D8 i8 F8 u+ a -n, : O4 W# y8 k9 [+ H) f+ W: [: n
--netrc Must read .netrc for user name and password--netrc-optional Use either .netrc or URL; overrides -n 0 R" j9 Q" e, @2 G! P% |7 g
--netrc-file FILE Set up the netrc filename to use
I: q6 z+ \ L! o, t$ A/ q8 w/ {
-N, --no-buffer Disable buffering of the output stream ; X* _8 V1 B) h) c; O/ e1 E
--no-keepalive Disable keepalive use on the connection--no-sessionid Disable SSL session-ID reusing (SSL)
7 f4 O7 h v3 T- ^; N --noproxy List of hosts which do not use proxy--ntlm Use HTTP NTLM authentication (H)
& y( \* v4 l3 Y2 S8 e0 N" O
8 r2 C! }7 i8 |# ^# c! p1 O4 a -o, --output FILE Write output to instead of stdout
6 M9 B9 l# A5 _1 @6 d --pass PASS Pass phrase for the private key (SSL/SSH)--post301 Do not switch to GET after following a 301 redirect (H)
2 Y7 \" c! G, V# p --post302 Do not switch to GET after following a 302 redirect (H)--post303 Do not switch to GET after following a 303 redirect (H) 8 S1 l: d6 ^3 `& u9 w$ X( ?/ {# ^
' b$ t! t+ [, W1 z) ?5 o
% c3 ^0 T8 p6 n) R. x -#, --progress-bar Display transfer progress as a progress bar--proto PROTOCOLS Enable/disable specified protocols
- N4 v' f5 x- e8 A- d* G --proto-redir PROTOCOLS Enable/disable specified protocols on redirect' I# y$ y$ f: a' q3 \9 B& V
z, ?. u3 @: y3 D# u, ]* r -x, --proxy [PROTOCOL://]HOST[ ORT] Use proxy on given port
! a+ s" Q; y$ P, M6 ]0 p/ l. u8 Y' X --proxy-anyauth Pick "any" proxy authentication method (H)--proxy-basic Use Basic authentication on the proxy (H) 3 E& N7 P2 S- E/ Z/ |4 p0 Y7 z$ F
--proxy-digest Use Digest authentication on the proxy (H)--proxy-negotiate Use Negotiate authentication on the proxy (H)
5 i. f# [( }' L; z --proxy-ntlm Use NTLM authentication on the proxy (H)
0 B. Q$ Y, }4 q. j( ]
: S* U& D& w2 a# N% q( E -U, --proxy-user USER[ ASSWORD] Proxy user and password 4 Q) l# S$ v z9 f! ^
--proxy1.0 HOST[:PORT] Use HTTP/1.0 proxy on given port
# c: W l% e6 h$ y& f" J
5 U+ o4 i* Z, v$ M5 E5 h -p, --proxytunnel Operate through a HTTP proxy tunnel (using CONNECT) / l8 t& k3 W6 `- g
--pubkey KEY Public key file name (SSH)9 G" { j$ J, I) E' K* h9 t: }
% Z5 v1 S/ T3 P5 |8 a -Q, --quote CMD Send command(s) to server before transfer (F/SFTP)
. H1 A, h# M2 n& g5 z; } --random-file FILE File for reading random data from (SSL)# S* \( S8 H& v8 t( x3 E6 K
$ q, R: |* |7 [
-r, --range RANGE Retrieve only the bytes within a range
' m' N# T5 T; K6 f+ P' Z --raw Do HTTP "raw", without any transfer decoding (H)
$ n; b e% m8 z9 N2 z+ `+ ]+ P; b( V8 T' r
-e, --referer Referer URL (H)
, V" W! t" {7 E1 d5 R T0 q/ Q* _8 N: J8 L( y+ e, s. G
-J, --remote-header-name Use the header-provided filename (H)
: Z) ^' Z: ]& B0 w! l' _' \4 z: T
! Q0 z" X$ w" ] ?7 A# E3 _) W' w7 s0 \! e7 x
-O, --remote-name Write output to a file named as the remote file--remote-name-all Use the remote file name for all URLs
4 ^: w# `+ I; V, k0 v( { Q9 r
: |& [/ D. T7 `2 s. T3 y* o5 g' D0 u2 ^
-R, --remote-time Set the remote files time on the local output
) F& n8 J' y, t/ v- E! E. t. [# s* \# Z5 I+ }
-X, --request COMMAND Specify request command to use
$ j4 b. {- }7 R w1 p --resolve HOST:PORT:ADDRESS Force resolve of HOST:PORT to ADDRESS--retry NUM Retry request NUM times if transient problems occur
. s- b, t! D/ ~1 a+ K# Q5 e! q( e" h --retry-delay SECONDS When retrying, wait this many seconds between each--retry-max-time SECONDS Retry only within this period 7 l V" R5 d9 |* @! i
. i/ v. y4 x$ u; I6 c
4 C5 f1 I- o8 B2 p7 V; M8 I
-S, --show-error Show error. With -s, make curl show errors when they occur
- \' l! J* V& ~# _ |$ N( A8 ~) @3 N4 Z7 `
-s, --silent Silent mode. Dont output anything . M8 `9 N' z( H6 l7 F2 t
--socks4 HOST[:PORT] SOCKS4 proxy on given host + port--socks4a HOST[:PORT] SOCKS4a proxy on given host + port & E) B1 ~. k, `4 _3 x
--socks5 HOST[:PORT] SOCKS5 proxy on given host + port--socks5-hostname HOST[:PORT] SOCKS5 proxy, pass host name to proxy * C, g( q3 j0 e2 F' m7 e* I
--socks5-gssapi-service NAME SOCKS5 proxy service name for gssapi--socks5-gssapi-nec Compatibility with NEC SOCKS5 server
* v9 W7 _4 N3 a$ X% E" e; s & h" o, R) i5 g0 q- ~
/ t- Q7 w8 j+ C- G
-Y, --speed-limit RATE Stop transfers below speed-limit for speed-time secs I9 s4 ^$ U% I. T
$ ^+ x3 E6 m2 V# ] -y, --speed-time SECONDS Time for trig speed-limit abort. Defaults to 30 2 B" _ `& [4 H6 z; h! D
--ssl Try SSL/TLS (FTP, IMAP, POP3, SMTP)--ssl-reqd Require SSL/TLS (FTP, IMAP, POP3, SMTP)-2, --sslv2 Use SSLv2 (SSL) * @1 B7 s: v2 R9 _
-3, --sslv3 Use SSLv3 (SSL)--ssl-allow-beast Allow security flaw to improve interop (SSL)--stderr FILE Where to redirect stderr. - means stdout $ ]( Y8 L* \. [3 U7 b! J
--tcp-nodelay Use the TCP_NODELAY option
* Z7 {5 y1 j# H. [ o5 v- F- j0 R( r" Z/ _
-t, --telnet-option OPT=VAL Set telnet option--tftp-blksize VALUE Set TFTP BLKSIZE option (must be >512) 4 c2 |: p& y% f: Q. i! P9 v+ b* }2 v
; C J2 T9 u r1 f
% ~0 u8 I+ y/ r
-z, --time-cond TIME Transfer based on a time condition-1, --tlsv1 Use => TLSv1 (SSL)--tlsv1.0 Use TLSv1.0 (SSL) # G P: C; i. }6 r+ v P K
--tlsv1.1 Use TLSv1.1 (SSL)--tlsv1.2 Use TLSv1.2 (SSL)--trace FILE Write a debug trace to the given file ! o7 l: D$ \. Q9 O, K7 |
--trace-ascii FILE Like --trace but without the hex output--trace-time Add time stamps to trace/verbose output
% `* A* Y: u2 x& P --tr-encoding Request compressed transfer encoding (H)
' V& H9 i: E0 C5 E# h4 S& I7 v1 O, j: \. o: a! }
-T, --upload-file FILE Transfer FILE to destination + _: `. i& m3 Z9 k
--url URL URL to work with
# f7 o0 k+ `8 ]3 r' c, C' [& g8 _! [+ O) B; j: ? e
-B, --use-ascii Use ASCII/text transfer, s$ d$ D9 T- ?! a* }
/ C. ~ [! Q$ M7 \- u -u, --user USER[:PASSWORD] Server user and password
5 a7 J3 m1 P8 Z: i- r" R4 } --tlsuser USER TLS username--tlspassword STRING TLS password--tlsauthtype STRING TLS authentication type (default SRP) ' T7 a- D- \. t% z, @& k
--unix-socket FILE Connect through this UNIX domain socket
# o+ l. {- b2 } s
- |/ J+ ?8 d8 x -A, --user-agent STRING User-Agent to send to server (H)
: @ `' C G; n6 M* g 6 N$ A( o9 O- j* B2 `0 C9 ~ X
3 {+ Q! j J9 q* r7 i2 S
-v, --verbose Make the operation more talkative
1 ]2 I) W+ }/ C: r X% e- g; o4 y' i: L1 C" j9 e
-V, --version Show version number and quit
& d8 x" Z2 Y3 }) m
: E( H% v. G* C: ]" C% c1 t -w, --write-out FORMAT What to output after completion $ O' V1 l3 k9 g$ Q# ~7 c. r3 ?9 _
--xattr Store metadata in extended file attributes, R, _+ k0 Q( _) E: L4 N3 w
]( e& Y( e3 p6 t# x
-q If used as the first parameter disables .curlrc
3 X2 v2 X2 P' n5 e F5 j7 n& c curl最全命令使用介绍:https://curl.se/docs/manpage.htmlcurl最全基础教程使用方式:https://curl.se/docs/manual.html常用的4种方式:post ,get,delete.put * l# a' I4 w9 f( V( C& [
curl get方式:curl url 直接访问curl -o url 下载 4 r1 f* v2 i- l, V6 e
get 加请求头-X 请求方式-H 请求头-v 显示请求信息-d请求体
Y. |3 ]- s% z: l H) Z9 Z curl -X GET -H "Content-type: application/json" -H "Content-Type: application/json" -d {"excelExportColumnList":[{"fieldName":"orderCode","title":"订单号"}],"excelName":"充电订单记录导出.xlsx","queryParams":{"cacheKey":" 6 J4 x' _( J! W( \: E
cdf8a3da-cf96-4d8b-8001-0e3802a25872"}} "http://*******/api/charge/report/searchChargerOrder"post 方式带token访问(post方式参数和get一样)
3 ^5 G9 F9 j5 F( k3 p$ _1 [ curl -X POST -H Authorization:{{4_5_Fe33QEGRSnh7Taotz4DLscmuNye02f8dyHYj_Jw.jQfVt4l6Xp7yUdtNxqdTpKXNbgUEmezd1zBuRSAK1Iw}} -H Content-Type: application/json -d {"name": "vipTest1"} url , x. e7 x) ?! {" F
put请求:服务注册发现用的比较多curl -X PUT -H "Content-Type: application/json" -d {"key1":"value"} "YOUR_URI"delete请求: ) S, m, f5 U. n# m) K
curl -v -X DELETE url看过我自己写的请求,只是基础使用,具体的方式都在curl官网,教程操作文档很全,我介绍了我们常用使用curl的方式,当然还有证书,代理,其他协议的使用,感兴趣的可以自己去官网研究下,curl支持脚本方式调用,不仅仅支持xshell脚本,还有代码。 * t- z+ X: K. _
————没有与生俱来的天赋,都是后天的努力拼搏(我是小杨,谢谢你的关注和支持)
+ ]4 b4 b! n/ @/ ?6 }* }- |" o% V0 m+ ]
# L, [- F7 I- E7 r+ f$ D( E
7 v! l4 u- K) n$ ?/ U7 O1 d* _
8 X' l: \2 o3 q3 Z |