在两个 curl 请求之间保存 cookie
Posted
技术标签:
【中文标题】在两个 curl 请求之间保存 cookie【英文标题】:Save cookies between two curl requests 【发布时间】:2015-08-25 22:24:54 【问题描述】:我知道使用 cURL
我可以看到我收到的 cookie / headers 通过使用
curl --head www.google.com
而且我知道我可以使用
向我的请求添加标头curl --cookie "Key=Value" www.google.com
我目前正在测试一个需要持久 cookie 的问题,而且可能有很多。
如何有效地保留两个
cURL
请求之间的 cookie?
如果可能,使用临时文件进行存储。
【问题讨论】:
【参考方案1】:使用--cookie-jar
或--dump-header
参数将接收到的cookies 保存到文件中。 --cookie
参数可以稍后从该文件中读回 cookie。
-b, --cookie
(HTTP) 将数据作为 cookie 传递给 HTTP 服务器。它应该是先前在“Set-Cookie:”行中从服务器接收到的数据。数据应采用“NAME1=VALUE1;NAME2=VALUE2”格式。
如果行中没有使用“=”符号,则将其视为文件名,用于从中读取先前存储的 cookie 行,如果它们匹配,则应在此会话中使用。使用此方法还会激活 cookie 引擎,它也会让 curl 记录传入的 cookie,如果您将其与 -L、--location 选项结合使用,这可能会很方便。要从中读取 cookie 的文件的文件格式应该是纯 HTTP 标头(Set-Cookie 样式)或 Netscape/Mozilla cookie 文件格式。
-b 指定的文件,--cookie 仅用作输入。不会将任何 cookie 写入文件。 要存储 cookie,请使用 -c, --cookie-jar 选项。
如果您使用此选项,请谨慎行事,并且可能会发生多次转移。如果您使用 NAME1=VALUE1;格式,或者在文件中使用 Set-Cookie 格式并且不指定域,然后为任何域发送 cookie(即使在重定向之后)并且不能被服务器设置的 cookie 修改。如果启用了 cookie 引擎并且服务器设置了同名的 cookie,那么两者都将在未来传输到该服务器时发送,这可能不是您想要的。要解决这些问题,请在 Set-Cookie 中设置域(这样做将包括子域)或使用 Netscape 格式。
如果多次使用此选项,将使用最后一个。
-c, --cookie-jar
(HTTP) 指定您希望 curl 在完成操作后将所有 cookie 写入哪个文件。 Curl 写入之前从指定文件读取的所有 cookie 以及从远程服务器接收到的所有 cookie。如果不知道任何 cookie,则不会写入任何数据。该文件将使用 Netscape cookie 文件格式写入。如果您将文件名设置为单个破折号“-”,cookie 将被写入标准输出。
此命令行选项将激活制作 curl 记录和使用 cookie 的 cookie 引擎。另一种激活它的方法是使用 -b, --cookie 选项。
如果无法创建或写入cookie jar,则整个curl操作不会失败,甚至不会清楚地报告错误。使用 -v 将显示警告,但这是您获得的关于这种可能致命的情况的唯一可见反馈。
自 7.43.0 起,以 Set-Cookie 格式导入的不带域名的 cookie 不会由此选项导出。
如果多次使用此选项,将使用最后指定的文件名。
-D, --dump-header
将协议头写入指定文件。
当您想要存储 HTTP 站点发送给您的标头时,使用此选项非常方便。然后可以使用 -b, --cookie 选项在第二次 curl 调用中读取来自标头的 Cookie! -c, --cookie-jar 选项是存储 cookie 的更好方法。
在 FTP 中使用时,FTP 服务器响应行被视为“标题”,因此保存在那里。
如果多次使用此选项,将使用最后一个
或者,不要使用命令行cURL app,而是编写一些使用libCurl library 的代码。这将使您更直接地控制 cookie 处理。 libCurl 有几个与 HTTP cookie 相关的特性:
curl_easy_getinfo()
的选项:
curl_easy_setopt()
的选项:
CURLOPT_COOKIE - 设置HTTP Cookie标头的内容
CURLOPT_COOKIEFILE - 从中读取 cookie 的文件名
CURLOPT_COOKIEJAR - 将 cookie 存储到的文件名
CURLOPT_COOKIESESSION - 开始一个新的 cookie 会话
CURLOPT_COOKIELIST - 添加或操作保存在内存中的 cookie
然后,您可以根据需要存储 cookie,并根据需要将它们分配给以后的 HTTP 会话。
【讨论】:
嘿,我很久以前就找到了-c
标志,在问了这个问题之后 - 从来没有意识到这里有一个答案。谢谢。
@dw1 是的,这就是要走的路
如果响应没有 Set-Cookie
标头,--cookie-jar
(或-b
)选项将不会保存任何内容,对吧?需要用re-captcha登录一个网站,但不得不求助a workaround by saving the curl
command from Chrome that already had the cookies,只是添加了-b -
(打印到stdout
),但没有任何乐趣。【参考方案2】:
curl -b cookie.txt -c cookie.txt <url>
或 curl --cookie cookie.txt --cookie-jar cookie.txt <url>
将存储和发送保存的 cookie。
【讨论】:
感谢您提供最简洁的示例。【参考方案3】:只是为了扩展已接受的答案。使用 --cookie 和 --cookie-jar 标志可以在没有文件写入的情况下使用,使用进程替换:
-
写入 STDOUT 并保存到 $cookie 变量中
cookie=$(curl -c - <url>)
-
从 $cookie 变量中读取 cookie
curl --cookie <(echo "$cookie") <url>
【讨论】:
【参考方案4】:感谢大家帮助我找到使用 CURL 登录我的 wordpress 网站的解决方案。这是我的一点贡献,希望对以后遇到这个问题的人也有帮助
对于高于 1706 的 Windows 10 版本,您可以从命令行使用 curl。
curl -c c:\Users\<your-name>\Desktop\cookie.txt -F "log=<your username>" -F "pwd=<your-pwd>" https://acme.net/wp-login.php
您不会在终端中看到任何响应。它只是自我刷新,但您的 cookie 已被存储。
然后在下面键入以读取并发送您刚刚存储的 cookie。
curl -b c:\Users\<your-name>\Desktop\cookie.txt -L https://acme.net/my-profile/
只有登录用户才能访问的整个网页将在您的终端内呈现,包括通过 javascript 动态加载的任何数据。
即使您的 WP 登录 URL 的端点是“/register/log-in”或“/login”,我仍然建议您使用“/wp-login.php”作为端点。这是因为某些 WP 主题在其登录页面的隐藏输入中具有登录随机数。原生 WP 登录页面没有这个。
您可以参考的其他来源:
https://wpmayor.com/login-to-wordpress-dashboard-via-curl/
https://gist.github.com/subfuzion/08c5d85437d5d4f00e58
https://www.youtube.com/watch?v=B4ilccLUQVs
https://makandracards.com/makandra/48262-how-to-use-cookies-with-curl
【讨论】:
以上是关于在两个 curl 请求之间保存 cookie的主要内容,如果未能解决你的问题,请参考以下文章