我想从终端登录远程网站,这需要用户名和密码才能登录.
所以我首先尝试登录到Stack Exchange站点之一.根据此答案,您可以使用-u username:password添加凭据.
所以我尝试了以下方法:
USERNAME="mine@gmail.com"
PASSWORD="myPassword"
URL="https://sustainability.stackexchange.com/"
curl $URL -u $USERNAME:$PASSWORD
Run Code Online (Sandbox Code Playgroud)
但是生成的网站不是登录用户看到的页面,而是非验证用户看到的页面,其显示了注册按钮.
我觉得它只适用于您在尝试访问时显示的弹出窗口中输入凭据的情况.
那么如何从终端内登录这些案例呢?
你可以通过浏览器的工具来完成.您需要通过Chrome浏览器>查看> Javascript控制台>网络>(右键单击)>复制选项菜单>单击选择"复制为cURL"复制包含所有标题的Cookie:
通常我们会这样卷曲:
curl -c cookie.txt -d "LoginName=username" -d "password=changepassword" https://examplesite/a
curl -b cookie.txt https://examplesite/b
Run Code Online (Sandbox Code Playgroud)
通过右键单击复制将非常大(当然我改变了一些东西以防止自己被黑客入侵):
curl 'https://meta.stackoverflow.com/' -H 'pragma: no-cache' -H 'accept-encoding: gzip, deflate, sdch, br' -H 'accept-language: en-US,en;q=0.8' -H 'upgrade-insecure-requests: 1' -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'cache-control: no-cache' -H 'authority: meta.stackoverflow.com' -H 'cookie: prov=xxxxxxxxxxx; __qca=P0-xxxxxxx-xxxxxx; acct=t=xxxxxxxxxxxx; _ga=GA1.2.xxxxxxxx; _gid=GA1.2.xxxxxxx; _ga=GA1.3.xxxxxxx; _gid=xxxxxxxxx9' -H 'referer: https://meta.stackoverflow.com/' --compressed
Run Code Online (Sandbox Code Playgroud)
不幸的是,登录协议比这复杂得多,并且不是 curl 内置的方案。这不是 curl 的工作,而是一些脚本语言(如 PHP 或 Python),尽管 libcurl 对管理 http 协议和 cookie 等有很大帮助。而 libxml2 将有助于解析隐藏在 HTML 中的登录 CSRF 密钥。他们可能需要引用标头,他们甚至可能会检查引用标头是否真实,而不是伪造的(idk,但我不会感到惊讶)。
首先,向https://sustainability.stackexchange.com/users/login发出一个普通的普通 HTTP GET 请求,并确保保存 cookie 和 html 响应。现在使用 id 提取表单的 POST URL 和输入元素login-form,这包括 CSRF 令牌、用户名和密码,以及其他一堆。然后application/x-www-form-urlencoded向https://sustainability.stackexchange.com/users/login发出一个编码的 POST 请求,使用从第一个 GET 请求中收到的 cookie,以及<input您提取的所有元素的 POST 数据,并记得填写“电子邮件”和“密码”输入。
现在您应该获取登录的 html,并继续获取页面的登录版本,请确保将相同的 cookie 会话 id 应用于下一个 http 请求(它的这个 cookie 会话 id 使网站记住您作为登录那个账号的那个人~)
这是 PHP 中的一个示例,使用 libcurl 和 libxml2(使用 PHP 的 DOMDocument 作为 libxml2 的便利包装器,并使用来自https://github.com/divinity76/hhb_.inc.php/blob/master/hhb_.inc.php 的hhb_curl作为 libcurl 的便利包装器,处理 cookie、引用、libcurl 错误处理(将无提示的 libcurl 错误转换为异常等),最后,它转储已登录的 HTML,证明它已登录。(以及提供的电子邮件/密码是一个用于测试的虚拟帐户,它没有问题,当我在此处发布凭据时显然会发生这种情况。):
<?php
declare(strict_types = 1);
require_once ('hhb_.inc.php');
$hc = new hhb_curl ( 'https://sustainability.stackexchange.com/users/login', true );
// getting a cookie session, CSRF token, and a referer:
$hc->exec ();
// hhb_var_dump ( $hc->getStdErr (), $hc->getStdOut () );
$domd = @DOMDocument::loadHTML ( $hc->getResponseBody () );
$inputs = array ();
$form = $domd->getElementById ( "login-form" );
$url = $form->getAttribute ( "action" );
if (! parse_url ( $url, PHP_URL_HOST )) {
$url = 'https://' . rtrim ( parse_url ( $hc->getinfo ( CURLINFO_EFFECTIVE_URL ), PHP_URL_HOST ), '/' ) . '/' . ltrim ( $url, '/' );
}
// hhb_var_dump ( $url, $hc->getStdErr (), $hc->getStdOut () ) & die ();
foreach ( $form->getElementsByTagName ( "input" ) as $input ) {
if (false !== stripos ( $input->getAttribute ( "type" ), 'button' ) || false !== stripos ( $input->getAttribute ( "type" ), 'submit' )) {
// not sure why, but buttones, even ones with names and values, are ignored by the browser when logging in,
// guess its safest to follow suite.
continue;
}
// var_dump ( $input->getAttribute ( "type" ) );
$inputs [$input->getAttribute ( "name" )] = $input->getAttribute ( "value" );
}
assert ( ! empty ( $inputs ['fkey'] ), 'failed to extract the csrf token!' );
$inputs ['email'] = 'vs5jkqyx4hw3seqr@my10minutemail.com';
$inputs ['password'] = 'TestingAccount123';
$hc->setopt_array ( array (
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query ( $inputs ),
CURLOPT_URL => $url
) );
$hc->exec ();
hhb_var_dump ( $inputs, $hc->getStdErr (), $hc->getStdOut () );
Run Code Online (Sandbox Code Playgroud)
有趣的是,默认情况下,libcurlmultipart/form-data在 POST 请求上使用-encoding,但是这个站点(和大多数站点,真的),application/x-www-form-urlencoded在 POST 请求上使用-encoding。在这里,我使用 PHP 的 http_build_query() 以application/x-www-form-urlencoded-format 格式对 POST 数据进行编码
| 归档时间: |
|
| 查看次数: |
537 次 |
| 最近记录: |