在两个curl请求之间保存cookies

126

我知道使用cURL可以查看使用过的cookie/头信息,方法是:

curl --head www.google.com

我知道可以通过添加头部信息来发送请求

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

我目前正在测试一个需要使用持久性cookie的问题,而且可能会有很多cookie。

如何在两个cURL请求之间高效地保留cookie?

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

4个回答

137
使用--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文件格式。
指定的文件只用作输入。不会将cookie写入该文件。要保存cookie,请使用-c,--cookie-jar选项。
如果您使用此选项并且可能会发生多个传输,请小心。如果使用NAME1=VALUE1;格式,或者在文件中使用Set-Cookie格式而不指定域,则cookie将发送到任何域(即使在跟随重定向后),并且无法由服务器设置的cookie进行修改。如果启用了cookie引擎,并且服务器设置了同名的cookie,则两者都将在将来传输到该服务器时发送,这可能不是您想要的。为了解决这些问题,请在Set-Cookie中设置域(这样做将包括子域)或使用Netscape格式。
如果多次使用此选项,则使用最后一个。
-c, --cookie-jar 将所有cookie保存到指定的文件中,在以后的请求中可重复使用。

(HTTP) 指定curl在完成操作后要写入哪个文件中的所有cookie。 Curl会将之前从指定文件读取的所有cookie以及从远程服务器接收到的所有cookie都写入该文件。如果没有已知的cookie,则不会写入任何数据。文件将使用Netscape cookie文件格式进行编写。如果将文件名设置为单破折号“-”,则cookie将被写入stdout。

此命令行选项将激活cookie引擎,使curl记录和使用cookie。另一种激活方法是使用-b、--cookie选项。

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

自7.43.0版本以来,以Set-Cookie格式导入但没有域名的cookie不会通过此选项导出。

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


-D、--dump-header <file>

将协议头写入指定文件。

当您要存储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标志,这是在我问了这个问题之后 - 从来没有意识到这里有一个答案发布。谢谢。 - Matt Clark
@dw1 是的,那是正确的方法。 - Remy Lebeau
如果响应没有 Set-Cookie 头,则 --cookie-jar(或 -b)选项不会保存任何内容,对吗?我需要登录一个带有 re-captcha 的网站,但不得不采用 通过保存已经具有 cookies 的 curl 命令的 Chrome 来解决问题,并只添加了 -b -(以打印到 stdout),但是没有成功。 - toraritte

99

curl -b cookie.txt -c cookie.txt <url>curl --cookie cookie.txt --cookie-jar cookie.txt <url> 均可存储和发送保存的 cookies。


12
谢谢提供这种最简洁的例子。 - Eric Manley

15

对于已接受的答案进行扩展。可以使用--cookie和--cookie-jar标志而无需进行文件写入,可以使用进程替换:

  1. 将内容写入STDOUT并保存到$cookie变量中
cookie=$(curl -c - <url>)

  • 从 $cookie 变量中读取 cookie

  • curl --cookie <(echo "$cookie") <url>
    
    

    5

    我要感谢所有人帮助我找到使用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登录网址的末端是'/register/log-in'或'/login',我仍然建议您使用'/wp-login.php'作为终点。这是因为某些WP主题在其登录页面上的隐藏输入中具有登录nonce。原生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

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接