ecb*_*die 8 bash curl http persistent-connection
我正在尝试编写一个BASH命令,该命令使用CURL将GET请求发送到两个不同的网页,但使用相同的连接.对我来说,就像向登录页面发送GET请求以向服务器进行身份验证,然后第二个请求模仿自动重定向到主页,这将发生在Web浏览器中(通过元刷新标记).我需要链接请求,因为主页的内容(由服务器生成)对于访客用户而言不同于经过身份验证的用户.
我首先根据SOF帖子的推荐尝试了这个命令(假设变量$IP并且$PORT已经用有效值定义):
curl -u user:pass ${IP}:${PORT}/login.php && curl ${IP}:${PORT}/index.php
Run Code Online (Sandbox Code Playgroud)
但是,我总是在第一个GET结束和第二个GET开始之间发生这样的事情:
* Connection #0 to host 10.0.3.153 left intact
* Closing connection #0
Run Code Online (Sandbox Code Playgroud)
那么SOF的帖子错了吗?无论如何,执行此命令将成功保持两个请求之间的连接打开:
curl -u user:pass ${IP}:${PORT}/login.php ${IP}:${PORT}/index.php
Run Code Online (Sandbox Code Playgroud)
但是,我真的更喜欢比前一个命令更接近前一个命令的解决方案.主要原因是将第一页的输出与第二页的输出分成两个不同的输出文件.所以我想做一些事情:
curl page1.html > output1 && curl page2.html > output2
Run Code Online (Sandbox Code Playgroud)
当然,我需要重用相同的连接,因为page2.html的内容依赖于我在同一个HTTP会话中对page1.html的请求.
我也对使用netcat或wget的解决方案持开放态度,但不是PHP!
做curl a.html && curl b.html必然会使用两个TCP(http)连接来获取数据.每个curl操作都是自己的进程,并将打开自己的连接.
但是,网站不使用TCP/HTTP连接来跟踪登录信息.相反,某种类型的令牌被放置在会话中(通常使用cookie),该会话在后续的站点请求中传递.该站点在后续请求中验证该令牌.
Curl有一个选项-c,用于指示连接之间应存储cookie的位置
curl -c cookiejar -u user:pass login.php && curl -c cookierjar index.php
Run Code Online (Sandbox Code Playgroud)
会更接近.我说更接近是因为许多站点不使用-u选项支持的基于http的身份验证,而是使用自定义表单,其次调用假定使用cookie(而不是在javascript或url路径中嵌入某些内容).后者很可能,但我不会指望第一位.