如何使用cURL发送Cookies?


296

我读到发送带有卷曲的cookie可行,但不适用于我。

我有一个REST端点为:

class LoginResource(restful.Resource):
    def get(self):
        print(session)
        if 'USER_TOKEN' in session:
            return 'OK'
        return 'not authorized', 401

当我尝试以以下方式访问时:

curl -v -b ~/Downloads/cookies.txt -c ~/Downloads/cookies.txt http://127.0.0.1:5000/
* About to connect() to 127.0.0.1 port 5000 (#0)
*   Trying 127.0.0.1...
* connected
* Connected to 127.0.0.1 (127.0.0.1) port 5000 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.27.0
> Host: 127.0.0.1:5000
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 401 UNAUTHORIZED
< Content-Type: application/json
< Content-Length: 16
< Server: Werkzeug/0.8.3 Python/2.7.2
< Date: Sun, 14 Apr 2013 04:45:45 GMT
<
* Closing connection #0
"not authorized"%

我的~/Downloads/cookies.txt位置:

cat ~/Downloads/cookies.txt
USER_TOKEN=in

服务器什么也没收到:

127.0.0.1 - - [13/Apr/2013 21:43:52] "GET / HTTP/1.1" 401 -
127.0.0.1 - - [13/Apr/2013 21:45:30] "GET / HTTP/1.1" 401 -
<SecureCookieSession {}>
<SecureCookieSession {}>
127.0.0.1 - - [13/Apr/2013 21:45:45] "GET / HTTP/1.1" 401 -

我想念的是什么?


我认为添加该-c选项可以告诉curl您将cookie文件用作输出cookie jar,这可能不是您想要的。
Blender

与一个 -b单独的选项也不能正常工作,给同样的错误:(
daydreamer 2013年

-bCookie文件的格式不仅是var=value,还应该与使用编写的Cookie罐的格式相同-c。转到使用此选项发送Cookie的站点,然后查看生成的文件。
Barmar

-b cookie_file应该为Netscape / Mozilla格式或纯HTTP标头。这是一个简单的http标头示例:Set-cookie:cookie_name = cookie_value; 这是最低要求。不要忘了最后的分号。
亚历克斯(Alex)

Answers:


492

这为我工作:

curl -v --cookie "USER_TOKEN=Yes" http://127.0.0.1:5000/

我可以使用查看后端的值

print request.cookies

17
只要您从未拥有过,就可以将用户令牌的布尔值设置为cookie,因为他们可以直接验证自己而不用这种方式登录。
matts1 2014年

15
根据手册页的说明,对于option -b, --cookie,例如curl -b <file-or-pairs>,如果参数是带有'='符号的字符串,则按原样传递,否则将其视为从中读取cookie的文件名。
ryenus 2014年

61
可以使用分号设置多个cookie--cookie "key1=val1;key2=val2;..."

我想知道为什么这个答案不是最重要的?答案排序插件有人吗?
iomv

91

您可以参考https://curl.haxx.se/docs/http-cookies.html,以获取有关如何使用Cookie的完整教程。您可以使用

curl -c /path/to/cookiefile http://yourhost/

写入cookie文件并启动引擎并使用cookie,您可以使用

curl -b /path/to/cookiefile  http://yourhost/

读取cookie并启动cookie引擎,或者如果它不是文件,它将传递给定的字符串。


1
海事组织,您没有在官方文档上进行任何改进,这很明显是泥泞- 除了-b标志超载之外,两者之间的本质区别是什么-c-b它们都启动引擎并指向cookie文件?
nhed

4
@nhed -c 写入 cookie文件,然后-b从中读取。因此,在发送登录表单的凭据时,您将指定-c将生成的cookie写入文件,然后将其用于-b读取cookie并将其包含在下一个请求中。
Madbreaks'Sep

26
或者像浏览器一样curl -b cookiefile -c cookiefile https://yourhost/读取写入相同的cookie存储。
LinuxDisciple

38

您在Cookie文件中使用的格式错误。正如curl文档指出的那样,它使用的是旧的Netscape cookie文件格式,该格式不同于Web浏览器使用的格式。如果您需要手动创建一个curl cookie文件,那么这篇文章应该会对您有所帮助。在您的示例中,文件应包含以下行

127.0.0.1   FALSE   /   FALSE   0   USER_TOKEN  in

具有7个以TAB分隔的字段,表示tailmatchpathsecureexpiresnamevalue


2
是的,这是cURL cookie格式。这些是TABS,而不是空间。
m3nda 2015年

4
这应该标记为正式答案,因为这确实解决了@daydreamer的安装失败的原因。
Valber

0

如果您已经在应用程序中发出了该请求,并在Google Dev Tools中看到了该请求,则可以在上下文选项卡中右键单击该请求,然后使用上下文菜单中的copy cURL命令。复制->复制为cURL。它将包含所有标题,cookie等。

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.