使用bash自动化Web登录

时间:2018-11-01 09:44:22

标签: linux bash curl wget

我一直在尝试制作一个bash脚本,该脚本将使用curl登录到Web登录表单,并稍后在使用保存的cookie时执行一些操作。我尝试了以前的stackoverflow解答方法,但在我的情况下没有任何效果,非常感谢您的帮助。

登录Web表单:

<form id="session_new" novalidate="novalidate" class="formtastic user" action="/admin/login" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="sometoken" />
  <fieldset class="inputs">
    <ol>
      <li class="email input required autofocus stringish" id="user_email_input"><label for="user_email" class="label">Email<abbr title="required">*</abbr></label><input id="user_email" autofocus="autofocus" type="email" value="" name="user[email]" />

      </li>
      <li class="password input required stringish" id="user_password_input"><label for="user_password" class="label">Password<abbr title="required">*</abbr></label><input maxlength="128" id="user_password" type="password" name="user[password]" />

      </li>
      <li class="boolean input optional" id="user_remember_me_input"><input type="hidden" name="user[remember_me]" value="0" /><label for="user_remember_me" class=""><input type="checkbox" name="user[remember_me]" id="soc_user_remember_me" value="1" />Remember me</label>

      </li>
    </ol>
  </fieldset>
  <fieldset class="actions">
    <ol>
      <li class="action input_action " id="user_submit_action"><input type="submit" name="commit" value="Login" data-disable-with="Login" />

这是我尝试使用的curl请求,

curl -d "user[email]=emailhere&user[password]=passwordhere&user[remember_me]=0&commit=Login" http://urlhere

但是它没有用,所以我厌倦了wget方法,

wget --save-cookies cookies.txt --keep-session-cookies --post-data="user[email]=emailhere&user[password]=passwordhere&user[remember_me]=0&commit=Login" "http://urlhere

它也不起作用。

1 个答案:

答案 0 :(得分:1)

您需要对输入-d中的数据进行URL编码,或使用--data-urlencode进行URL编码。例如:

email=test
password=test

curl --data-urlencode "utf8=&#x2713;" \
     --data-urlencode "authenticity_token=sometoken" \
     --data-urlencode "user%5Bemail%5D=$email" \
     --data-urlencode "user%5Bpassword%5D=$password" \
     --data-urlencode "user%5Bremember_me%5D=0" \
     --data-urlencode "commit=Login" http://your.domain/admin/login

我的猜测也是authenticity_tokencsrf token,因此在发送请求之前,您必须首先取消该值。以下使用pup获取该authenticity_token值,并在我们的请求中使用该值:

page_url=http://your.domain/myPage
login_url=http://your.domain/admin/login

email=test
password=test

rm -f cookies.txt

csrf_token=$(curl -s "$page_url" -c cookies.txt | pup 'input[name="authenticity_token"] attr{value}')

curl --data-urlencode "utf8=&#x2713;" \
     --data-urlencode "authenticity_token=$csrf_token" \
     --data-urlencode "user%5Bemail%5D=$email" \
     --data-urlencode "user%5Bpassword%5D=$password" \
     --data-urlencode "user%5Bremember_me%5D=0" \
     --data-urlencode "commit=Login" "$login_url" -b cookies.txt -c cookies.txt

在上面的脚本中,我还将cookie保存在名为cookies.txt的文件中,在后续请求中,请使用-b cookies.txt来保持会话