【问题标题】:Save cookies between two curl requests在两个 curl 请求之间保存 cookie
【发布时间】:2015-08-25 22:24:54
【问题描述】:

我知道使用 cURL 我可以看到我收到的 cookie / headers 通过使用

curl --head www.google.com

而且我知道我可以使用

向我的请求添加标头
curl --cookie "Key=Value" www.google.com

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

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

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

【问题讨论】:

    标签: http curl cookies header


    【解决方案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() 的选项:

    然后,您可以根据需要存储 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 标志可以在没有文件写入的情况下使用,使用进程替换:

    1. 写入 STDOUT 并保存到 $cookie 变量中
    cookie=$(curl -c - <url>)
    
    
    1. 从 $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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-22
        • 1970-01-01
        • 2019-10-15
        • 2020-12-26
        • 2011-10-26
        • 2016-07-02
        • 2014-09-25
        • 1970-01-01
        相关资源
        最近更新 更多