curl探讨网络会话

时间:2012-04-04 09:09:28

标签: curl

有点“新手问题”,以部分确认/纠正我的理解: 我想实现一些自动化网站探测包括。登录,我不想实际提取任何数据。从早期的工作我记得curl和只是检查URL可用性(eval HTTP响应代码,例如200或不是200)这很好用。 现在任务也正在登录 - 但我无法让它工作,并怀疑这是否按预期工作。经过一段时间的实验和搜索WWW后,我找不到明确的答案 - 所以我的希望就在这里: - )

最初我的想法是使用一个脚本,然后在里面放入curl POST命令,以防使用cookies选项,例如:

$ curl -s -w "%{http_code}" -o /tmp/tge-HTML.out -b /tmp/tge-cookies -c /tmp/tge-cookies -F "username=bla&passwd=blub&Submit=Login" http://some.url

(我使用HTTPfox来确定POST参数,而且我肯定会确定它们是正确的)

然后我搜索文件/tmp/tge-HTML.out是否包含“Logout”作为我已登录的证据(即使没有登录,我总是在所有测试中获得HTTP 200我试过的网址。

在其中一个案例中(后面有一个Tomcat)我看到,在Firefox登录后,后续的网址包含...& jsessionid = ...当然,我最初不知道 - 所以我尝试了几件事,比如说在shell脚本中调用curl(命令!)两次,从第一个获取sessionID并将其附加到第二个URL,如:

 $ curl -s -w "%{http_code}" -o /tmp/tge-HTML.out -b /tmp/tge-cookies -c /tmp/tge-cookies -F "username=bla&passwd=blub&Submit=Login" http://some.url
 ... extract jsessionid from /tmp/tge-HTML.out ...
 $ curl -s -w "%{http_code}" -o /tmp/tge-HTML.out -b /tmp/tge-cookies -c /tmp/tge-cookies 
    http://some.url/...?jsessionid=...

但无论我尝试过什么,我都无处可去: - | 现在的问题是:

  1. 如果我按照上面的示例执行基于卷曲的POST,请执行此操作 (通常?)获取完整的HTML页面作为响应就像我看到的那样 登录后在常规Web浏览器中?

    • 看起来好像是真的,但是应该做一个简单的POST,它应该包含“Logout”......
    • 然而,因为我从来没有让这个工作,可能会出现什么问题?
  2. 如果我必须做多个HTTP请求,那么 使用curl命令的概念就像那样工作?什么 卷曲退出时会发生什么?套接字关闭和Web服务器 可能关闭会话(我的jsessionid无效)?

    • 如果这种方法不起作用,基于libcurl的概念可能会更好吗?例如。 phpcurl(只是阅读它但从未尝试过)我将会话保存在我的PHP脚本中,因此连接/会话保持打开等...
    • 可能取决于网站是否使用cookies?
  3. 有没有更好的想法如何实现 创见?理想情况下,一些脚本应该很简单但是 没有庞大的监控套件

  4. 很可能有很多“依赖......”: - |此外,可能问题不是100%精确,但任何提示都赞赏! : - )

    RGDS,   TGE

1 个答案:

答案 0 :(得分:0)

好的,最后我取得了一些进展 - 也许它有助于其他人...... 首先,基于脚本的方法确实有效,至少在服务器端有一个Joomla的测试用例中(稍后我会尝试其他的)。解决方案的关键是: CURL login by script to a Joomla website

与描述的方法类似,我从第一个GET的响应中提取令牌并将其放入第二个GET的表单参数中:

rm -f /tmp/tge-cookies
HTTP_CODE=$(./curl -s -w "%{http_code}\\n" -o /tmp/tge-HTML-out.1 -b /tmp/tge-cookies -c /tmp/tge-cookies -L ${URL})
# Eval HTTP_CODE ...
Token=`awk '{ if(match($1, "<input") && match($3, "name=\"[a-z0-9]+\""))
  {
    gsub("name=\"", "", $3);
    gsub("\"", "", $3);
    if(length($3) == 33)
    {
      print $3;
      exit 0;
    }
  } }' /tmp/tge-HTML-out.1`
HTTP_CODE=$(./curl -L -s -w "%{http_code}\\n" -o /tmp/tge-HTML-out.2 -b /tmp/tge-cookies -c /tmp/tge-cookies -d "username=${User}&passwd=${Pass}&option=login&task=login&${Token}=1&remember=yes&Submit=Login" ${URL})
# Eval HTTP_CODE ...
# Eval /tmp/tge-HTML-out.2 whether containing "Logout" ...

第二个区别是使用“-F”不起作用,但“-d”起作用。 非常有趣的是POST参数与我在HTTPfox中看到的不同。

此致   TGE