我一直在尝试制作一个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="✓" /><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
它也不起作用。
答案 0 :(得分:1)
您需要对输入-d
中的数据进行URL编码,或使用--data-urlencode
进行URL编码。例如:
email=test
password=test
curl --data-urlencode "utf8=✓" \
--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_token
是csrf 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=✓" \
--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
来保持会话