2017-08-18 72 views
0

我想访问包含数据的json页面。 说,它在那里根据http://example.com/home/apples.json 它受保护,所以显示登录页面。 如果我要手动访问它,我首先去http://example.com/那里我得到一个登录菜单,并在登录后说用户“测试”与密码“测试”访问http://example.com/home/apples.json again将显示我的JSON数据。curl - 如何从登录后获取cookie以发送curl命令?

如果我做了

curl -u test:test http://example.com/home/apples.json -v 

我在登录页面结束。 (尽管认证。)

如果我访问http://example.com/并手动登录,我将在登录后得到一个cookie。说这个cookie被称为ltoken并获得值“dj8f”。它只会在成功登录后才会显示。当我看到它通过浏览器和复制的cookie数据并将其连接到curl命令:

curl -b "ltoken="dj8f" http://example.com/home/apples.json -v 

它会奏效。

如何从登录后获取cookie数据而无需手动执行? 是否有可能通过bash shell脚本方式?如果是的话如何?或者,如何在groovy脚本中完成?

回答

1

您必须首先使用curl执行正确的登录。为了做到这一点,请导航到登录页面并查看源代码。登录表单应该看起来像这样。

<form action="http://example.com/login/target" method="POST"> 
    <input type="text" name="username" /> 
    <input type="password" name="passphrase" /> 
    <input type="submit" value="Log in" /> 
</form> 

(我假设有没有隐藏的输入字段。隐藏输入字段经常被用来防止伪造请求,这基本上就是我们要做的。)

从这个剪断你有提取登录请求的目标(在本例中为http://example.com/login/target)HTML输入字段的名称(此处为usernamepassphrase)。执行登录过程中,你应该通过执行发送的登录信息发送到目标,例如

curl --cookie-jar cookies.txt --form passphrase=test --form username=test http://example.com/login/target 

(请注意,一般不建议用这种方法在命令行中输入您的密码。您的密码可能存储在命令历史记录中,并可能被盗取。)

--cookie-jar选项告诉curl将所有cookie存储在文件中。如果登录成功并且服务器设置了会话cookie,curl会将它们保存在此文本文件中。

成功登录后,如果请求包含来自cookie-jar的cookie,您应该能够访问json文件。这可以通过参数-b来实现。如果-b不包含=字符,curl将使用该文件的内容作为cookie。

curl -b cookies.txt http://example.com/home/apples.json -v 
+0

我已经试过这个,但是写入该文件的cookie在登录后不包含相关的cookie,但只有在登录之前。因此,subsquent curl命令只会再次引用登录页面。在描述中我已经说得更好了。 – kumoyadori

+0

好吧,好吧,我假设登录工作了......如果不是这样,你必须*假装填写登录表单*。 AFAIK'-u'选项用于通过'HTTP'字段发送登录信息。这在当今很少使用。通常您必须查看登录页面的'

',并找出:名称/密码字段的名称和提交的目标。然后您可以使用'--form'或'--data'发送表单数据。 – sauerburger

+0

我已经概述了,这可以怎么做。 – sauerburger