linux - 使用 bash 自动登录 Web

标签 linux bash curl wget

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

登录WebForm:

<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

也没用。

最佳答案

您需要对放入 -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_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=&#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 来保持 session

关于linux - 使用 bash 自动登录 Web,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53098678/

相关文章:

linux - 意外标记附近的语法错误

regex - 如何在 bash 中匹配零个或多个模式实例?

java - Bash 编译 Java 类和 JAR

python - 如何使用 Curl 发布文件列表

php - 使用文件获取内容或 curl

退出 fork 窗口管理器后无法输入 GtkEntry

linux - 根据另一个文件中的关键字在文件目录中搜索

linux - 命令的输出未传递给分配的变量

linux - 完成压缩 IP 报头的 Xmit

php - 获取最终重定向 URL