使用CURL访问一个需要从另一个页面登录的页面

148
我有两个页面:xyz.example/axyz.example/b。只有在登录到xyz.example/a后,我才能访问xyz.example/b。如果不经过另一个页面访问xyz.example/b,则浏览器会显示访问被拒绝(没有重定向到登录页面)。一旦我在xyz.example/a登录成功,我就可以访问另一个页面。
我的问题是如何使用curl命令来实现这一点。我可以使用curl成功登录到xyz.example/a,但是尝试访问xyz.example/b时却被拒绝访问。
我使用以下命令:
curl --user user:pass https://xyz.example/a  #works ok
curl https://xyz.example/b #doesn't work

我尝试过使用第二行代码,包括用户名和密码部分和不包括用户名和密码部分,但仍然无法正常工作。两个页面都使用相同的CA,所以这不是问题。

4个回答

188

另外,您可能希望通过浏览器登录并获取包括Cookie在内的所有头部信息的命令:

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

截图


25
这是一个深刻的回答!它并没有直接回答问题,而是展示了如何回答它。 - bgStack15
9
那是最有用的答案之一。它真正让你能够观察和理解多步验证。 - Pierre D
4
我不知道这些很棒的工具中埋藏着这个功能。超级有用! - Timothy C. Quinn
1
如果我能在我的浏览器中找到它,那就正是我所需要的。你需要进行某种启用吗?在我的上下文菜单中找不到它。使用的是FF 97.0.2,Linux操作系统。 - some-non-descript-user

182
这个网站可能使用 cookies 存储您的会话信息。当您运行时,它们将被发送到您的浏览器中。
curl --user user:pass https://xyz.example/a  #works ok
curl https://xyz.example/b #doesn't work

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

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

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

然后在第二次运行时将它们读取回来:

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

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


这很奇怪,因为当我尝试这样做时,它不起作用,因为存储在“somefile”中的cookie包含路径参数(在本例中为“/a”),并且未转发到第二个调用。如果我编辑文件中的cookie并仅放置一个斜杠,则它可以工作(cookie转发到第二个调用)。您知道是否有可能防止在cookie文件中存储路径吗? - рüффп
请注意,--cookie ./somefile 如果 ./somefile 不存在,不会报错,而是将其作为 cookie 标头发送:“告诉 curl 从文件中读取 cookie 并启动 cookie 引擎,或者如果它不是文件,则传递给定的字符串。” 多么奇怪的实现方式啊! - not2savvy

57

经过一些搜索,我找到了这个:

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

我不确定它是否有效,但它可能会指引你朝着正确的方向。


10
如果你有一个需要提交表单的网站,这个方法会生效。你需要查看源代码,并找到<form>标签,看一下字段名称以及需要发出post请求的URL是什么。你可以使用浏览器调试器来查找post请求,以便查看发送了什么内容。这样做会更容易一些。 - stonefury

5

我的回答是对@JoeMills和@user的回答进行修改得到的。

  1. 获取一个命令来登录服务器:

    • 加载网站的登录页面并打开开发人员工具的网络选项卡
      • 在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上尝试过这种方法,它非常好用。


1
如果网站也要求验证码,那么参数应该如何编写? - riccs_0x
无法使用cURL实现。也许可以使用类似puppeteer的工具来编程式地浏览页面。 - Timothy C. Quinn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接