在两个curl请求之间保存cookie


74

我知道使用cURL可以看到我收到的Cookie /标头

curl --head www.google.com

我知道我可以使用添加标题到我的请求

curl --cookie "Key=Value" www.google.com

我目前正在测试需要持久性Cookie的问题,并且其中可能有很多。

如何有效地保留两个cURL请求之间的cookie ?

如果可能,请使用临时文件进行存储。

Answers:


86

使用--cookie-jar--dump-header参数将接收到的cookie保存到文件中。该--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)指定完成操作后要卷曲将所有cookie写入哪个文件。Curl写入先前从指定文件读取的所有cookie,以及从远程服务器接收的所有cookie。如果未知cookie,将不会写入任何数据。该文件将使用Netscape cookie文件格式写入。如果将文件名设置为单破折号“-”,则cookie将被写入stdout。

此命令行选项将激活cookie引擎,该引擎进行curl记录并使用cookie。激活它的另一种方法是使用-b,--cookie选项。

如果无法创建或写入Cookie罐,则整个curl操作将不会失败,甚至不会清楚地报告错误。使用-v将显示警告,但这是您对这种可能致命的情况的唯一可见反馈。

从7.43.0开始,以Set-Cookie格式导入的没有域名的cookie不会通过此选项导出。

如果多次使用此选项,将使用最后指定的文件名。

-D,--dump-header <文件>

将协议标头写入指定的文件。

当您要存储HTTP站点发送给您的标头时,可以方便地使用此选项。然后可以使用-b,--cookie选项在第二次curl调用中读取标题中的cookie!-c,--cookie-jar选项是存储cookie的更好方法

在FTP中使用时,FTP服务器响应行被视为“标头”,因此保存在此处。

如果多次使用此选项,将使用最后一个

或者,代替使用命令行cURL应用程序,编写一些使用libCurl库的代码。这将使您可以更直接地控制cookie处理。libCurl具有与HTTP cookie相关的若干功能:

的选项curl_easy_getinfo()

的选项curl_easy_setopt()

然后,您可以根据需要存储cookie,并根据需要将其分配给以后的HTTP会话。


嘿,我-c问了这个问题很久以前就找到了国旗-从来没有意识到这里有答案。谢谢。
马特·克拉克

@ dw1是的,这就是要走的路
Remy Lebeau

--cookie-jar(或-b)选项不会在响应中没有Set-Cookie标题的情况下保存任何内容,对吗?需要使用重新验证码登录到网站,但不得不采取一种变通办法,方法是curl从Chrome中保存已经具有Cookie的命令,并只是添加了-b -(打印到stdout),但没有任何乐趣。
toraritte

30

curl -b cookie.txt -c cookie.txt <url>curl --cookie cookie.txt --cookie-jar cookie.txt <url>同时存储和发送已保存的Cookie。


1
感谢您提供的最简洁的示例。
埃里克·曼利

2

我要感谢这里的所有人帮助我找到使用CURL登录到我的wordpress网站的解决方案。这是我的一点贡献,希望对将来遇到这种情况的人有所帮助

对于Windows 10版本比1706更新的版本,您可以从命令行使用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 / login”或“ / 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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.