cURL cookie语法(来自bash CLI,不是cookie文件)

时间:2012-02-10 05:50:12

标签: linux bash http curl

我有一个Web服务器,它返回给我的cookie值,我在请求中发送了它。为此,我已经成功使用了--cookie文件(减去了一个小的减速带,其中有一个标签来源于cookie文件中的空格问题)。

不幸的是,如果我在命令中运行相同的命令但使用cookie名称和值而不是cookie文件,我的服务器不会响应所需的结果。

根据cURL文档,这样的事情应该有效:

curl --cookie'cookiename = cookievalue'--cookie-jar - http://my.site.com/page/with/cookies -v

但事实并非如此。但是,如果我使用制表符分隔的cookie文件而不是命令行中的参数,它将成功运行。更重要的是,我在CLI中尝试了几乎所有这些cookie参数的排列无效:tab-delimited,name = cookiename; value = cookievalue(etc),逗号,路径,--header等等

当我并排比较出站请求时,我发现成功请求和不成功请求之间没有明显区别,但如果我在命令行中传递cookie而不使用cookie文件,则响应不会返回预期结果。我在这里忽略了什么重要但微妙的细微差别?

1 个答案:

答案 0 :(得分:9)

我很想知道这是否会在我的服务器上出现问题以及我需要解决的问题。

首先,我使用浏览器进行了测试,以研究基线行为。

首先,我连接以确保没有设置cookie:

http://hostname/test/testcookie.php

Cookie: array(0) {
}

然后我连接到我的脚本来设置cookie。

http://hostname/test/setcookie.php

Cookie set.

然后我检查确保浏览器正在发送新的cookie:

http://hostname/test/testcookie.php

Cookie: array(1) {
  ["cookiename"]=>
  string(11) "cookievalue"
}

一旦我验证了浏览器/服务器的行为,就可以使用curl从命令行进行操作了。

首先,我们将看到当我们不尝试向服务器发送cookie时会发生什么:

$ curl -s "http://hostname/test/testcookie.php"

结果如下:

Cookie: array(0) {
}

接下来,我们会看到当我们使用问题中提到的--cookie发送Cookie时会发生什么:

$ curl -s --cookie "cookiename=cookievalue" "http://hostname/test/testcookie.php"

Cookie: array(1) {
  ["cookiename"]=>
  string(11) "cookievalue"
}

这表明--cookie参数确实有效,也许OP还有其他可能需要调试的问题。

现在,为了好玩,让我们看看当我们使用cookie文件并调用cookie设置脚本时会发生什么:

$ curl -s --cookie-jar /tmp/cookiefile "http://hostname/test/setcookie.php"

Cookie set.

这是cookie在文件中的样子:

  

主机名标签 FALSE 标签 /测试/ 标签 FALSE 标签 1333484771 标签 cookiename 标签 cookievalue

现在我们将调用cookie测试人员并使用cookie文件。

$ curl -s --cookie /tmp/cookiefile "http://hostname/test/testcookie.php"

Cookie: array(1) {
  ["cookiename"]=>
  string(11) "cookievalue"
}

我希望这有助于调试任何人可能拥有的cookie问题。


以下是我在/test路径中在服务器上使用的文件。

这是/www/test/testcookie.php:

<?php
header("Content-type: text/plain");
echo "Cookie: ";
var_dump($_COOKIE);
?>

这是/www/test/setcookie.php:

<?php
header("Content-type: text/plain");
setcookie("cookiename", "cookievalue", time()+86400 );
?>
Cookie set.