автоматизация входа в систему с помощью bash - PullRequest
0 голосов
/ 01 ноября 2018

Я пытался создать bash-скрипт, который будет входить в веб-форму входа с помощью curl и выполнять некоторые действия позже, используя сохраненные файлы cookie. Я пробовал предыдущие методы ответов stackoverflow, но ничего не работает в моем случае, помощь очень ценится.

WebForm of Login:

<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 голосов
/ 01 ноября 2018

Вам необходимо URL-кодировать данные, которые вы вводите в -d или использовать --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 , поэтому вам придется сначала удалить это значение перед отправкой запроса. Следующее использует 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, чтобы сохранить сеанс

...