139

我有 2 页:xyz.com/axyz.com/b. xyz.com/b只有当且仅当我首先登录时,我才能访问xyz.com/a。如果xyz.com/b不通过另一个访问,我只是通过浏览器拒绝访问(不重定向到登录)。一旦我登录xyz.com/a,我可以访问另一个。

我的问题是使用 curl 命令执行此操作。我可以xyz.com/a使用 curl 成功登录,但随后尝试xyx.com/b访问被拒绝。

我使用以下内容:

curl --user user:pass https://xyz.com/a  #works ok
curl https://xyz.com/b #doesn't work

我已经尝试使用带有 & 而没有用户/密码部分的第二行,但仍然无法正常工作。两个页面都使用相同的 CA,所以这不是问题。有什么建议么?谢谢

4

4 回答 4

167

该网站可能使用cookie来存储您的会话信息。当你跑

curl --user user:pass https://xyz.com/a  #works ok
curl https://xyz.com/b #doesn't work

curl在两个单独的会话中运行两次。因此,当第二个命令运行时,第一个命令设置的 cookie 不可用;这就像您a在一个浏览器会话中登录页面,并尝试访问另一个浏览器中b的页面。

您需要做的是保存由第一个命令创建的 cookie:

curl --user user:pass --cookie-jar ./somefile https://xyz.com/a

然后在运行第二个时将它们读回:

curl --cookie ./somefile https://xyz.com/b

或者,您可以尝试在同一命令中下载这两个文件,我认为这将使用相同的 cookie。

于 2012-09-13T03:53:18.713 回答
159

此外,您可能希望通过浏览器登录并获取包含所有标题的命令,包括 cookie:

打开开发人员工具的网络选项卡,登录,导航到所需的页面,使用“复制为 cURL”。

截屏

于 2017-02-03T16:30:14.270 回答
54

经过一番谷歌搜索后,我发现了这个:

curl -c cookie.txt -d "LoginName=someuser" -d "password=somepass" https://oursite/a
curl -b cookie.txt https://oursite/b

不知道它是否有效,但它可能会引导您朝着正确的方向前进。

于 2012-09-13T03:45:52.427 回答
2

我的回答是@JoeMills 和@user 的一些先前回答的模型。

  1. 获取cURL登录服务器的命令:

    • 加载网站的登录页面并打开开发者工具的网络面板
      • 在Firefox中,右键单击页面,选择“检查元素(Q)”并单击网络选项卡
    • 转到登录表单,输入用户名、密码并登录
    • 登录后,返回网络窗格并滚动到顶部以找到 POST 条目。右键单击并选择复制 -> 复制为 CURL
    • 将此粘贴到文本编辑器并在命令提示符下尝试此操作以查看它是否有效
      • 某些网站可能已经加固,会阻止这种类型的登录欺骗,需要以下更多步骤才能绕过。
  2. 修改 cURL 命令以在登录后能够保存会话 cookie

    • 删除条目-H 'Cookie: <somestuff>'
    • curl在开始之后添加-c login_cookie.txt
    • 尝试运行此更新的 curl 命令,您应该'login_cookie.txt'在同一文件夹中获得一个新文件
  3. 使用要求您登录的新 cookie 调用新网页

    • curl -b login_cookie.txt <url_that_requires_log_in>

我在 Ubuntu 20.04 上试过这个,它就像一个魅力。

于 2020-07-15T19:05:39.147 回答