2 votes

Se connecter à un site (stackoverflow) par bash

Comment puis-je me connecter à un site web en utilisant Bash sous Linux. Par exemple, pour se connecter à StackOverflow J'ai essayé plusieurs méthodes différentes, présentées ci-dessous, mais rien n'a fonctionné.

wget --save-cookies cookies.txt --keep-session-cookies --post-data="username=blahblah&password=blahblahblha" "https://stackoverflow.com/users/login?ssrc=head&returnurl=https%3a%2f%2fstackoverflow.com%2f"

ou

curl --user myusername:mypassword https://stackoverflow.com/users/login?ssrc=head&returnurl=https%3a%2f%2fstackoverflow.com%2f -v 

J'ai essayé d'inspecter l'élément à l'aide de Chrome pour copier l'adresse de l'élément. curl mais cela n'a pas fonctionné (peut-être que cela dépend d'un cookie et n'est valable que pour une certaine période de temps).

Notez que j'ai besoin de me connecter avec un nom d'utilisateur et un mot de passe et non avec un cookie.

9voto

F. Hauri Points 5893

Pour le plaisir seulement : Connection: keep-alive

Introduction

Mon but était de construire un bash environnement où le script actuel pourrait traiter de manière interactive avec une session https authentifiée. Cela pourrait être utilisé pour répondre à de nombreuses cibles IOT, à toute plateforme de fournisseur pour surveiller un compte personnel, etc.

Malheureusement, cela pourrait être mal utilisé pour stresser ou pirater des plates-formes web (en ciblant n'importe qui) ou même pour cibler L'insigne de fanatique de SO (sale tricheur !).

Mes excuses pour toute mauvaise utilisation de ceci, de toute façon je ne suis pas responsable de ce que les gens font.

Près de pure bash : exiger seulement openssl :

... et gpg mais vous êtes libre de stocker votre lettre de créance d'une autre manière.

Préparer quelques valeurs :

#!/bin/bash
shopt -s extglob

URL='https://stackoverflow.com/'
IFS=: read  -r user pass < <(gpg -qd <socred.gpg)

IFS=/ read -r _ _ hst _ <<<"$URL"

Running openssl comme tâche de fond :

exec {wwwE}<> <(: - O)
exec {wwwI}<> <(: - b)
exec {wwwO}< <(
  exec stdbuf -o0 openssl s_client -quiet -connect "$hst":443 <&$wwwI 2>&$wwwE)
osslpid=$!

Alors maintenant, il y a un peu doReq pour créer 2 variables : $cookie et $htstatus et 3 réseaux : $hthead , $htbody y $hterr :

doReq() {
    hthead=() htbody=() hterr=()
    local target=$1 method=${2:-GET} head=true line cookies
    printf >&$wwwI '%s\r\n' "$method $target HTTP/1.1" "Host: $hst" \
           "User-Agent: aobs/0.01" "Connection: keep-alive" "Accept: */*"
    [ "$cookie" ] && printf >&$wwwI '%s' "$cookie"
    if [ "$method" = "POST" ];then
        printf >&$wwwI '%s\r\n%s\r\n\r\n%s' "Content-Length: ${#3}" \
                       'Content-Type: application/x-www-form-urlencoded' "$3"
    else printf >&$wwwI '\r\n'
    fi
    read -t 10 -ru $wwwO line
    htstatus=${line%$'\r'} ; hthead=("$htstatus")
    while read -t .3 -ru $wwwO line;do
        [ "${line%$'\r'}" ] || head=false;
        if $head ;then
            hthead+=("${line%$'\r'}");
            case $line in
                [sS]et-[cC]ookie:* ) line=${line#*: };
                                 cookies+=("${line%%;*}");;
            esac
        else htbody+=("${line%$'\r'}") ;fi
    done
    if read -t 0 -ru $wwwE;then
        while read -t .1 -ru $wwwE line;do
            hterr+=("${line%$'\r'}")
            case $line in
                depth* | verify* ) ;;
                * ) echo "ERR: $line" ;;
    esac ; done ; fi
    [ ! -v "cookie" ] && [ "${cookies[0]}" ] &&
        printf -v cookie 'Cookie: %s\r\n' "${cookies[@]}"
}

Utilisation : doReq /file_part_of_URL [method] [post datas]

On se connecte :

doReq /users/login POST "email=$user&password=$pass"

Maintenant, montrez mes badges :

doReq /
for ((i=${#htbody[@]};i--;)) ;do
    line="${htbody[i]}"
    case $line in
        *badge1* ) line="${htbody[i-1]}${htbody[i]}${htbody[i+1]}"
                   line=${line//>+([0-9])</><} line=${line//<*([^>])>}
                   printf '%b\n' "${line//&#9679;/ \\U25cf }" ;;
esac ; done

Sur mon bureau, avec mon compte, cette empreinte :

  13 gold badges  88 silver badges  112 bronze badges                            

(à l'instant).

Bien sûr, vous êtes maintenant prêt à courir. doReq quand vous le souhaitez, car la connexion reste ouverte. Nous sommes maintenant dans environnement/condition cité dans le Introduction . (La version sur mon site fait une boucle perpétuelle, demandant ceci d'une manière plus efficace, toutes les 20 secondes, jusqu'à l'interaction de l'utilisateur. Voir au bas de cette page).

...

Une fois que vous avez terminé, avant de sortir, vous pourriez arrêter openssl et fermez votre fd :

(J'ai ajouté ls y ps comme déboguer commandes)

ls -l /dev/fd/ ; ps --tty $(tty) ufw
kill $osslpid
exec {wwwE}<&-
exec {wwwI}>&-
exec {wwwO}<&-
ls -l /dev/fd/ ; ps --tty $(tty) ufw

Cette émission :

total 0
lrwx------ 1 user user 64 jui  2 13:52 0 -> /dev/pts/2
l-wx------ 1 user user 64 jui  2 13:52 1 -> /dev/pts/2
lrwx------ 1 user user 64 jui  2 13:52 10 -> pipe:[940266653]
lrwx------ 1 user user 64 jui  2 13:52 11 -> pipe:[940266654]
lr-x------ 1 user user 64 jui  2 13:52 12 -> pipe:[940266655]
lrwx------ 1 user user 64 jui  2 13:52 2 -> /dev/pts/2
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user    28110  0.0  0.0  11812  7144 pts/7    Ss   jui01   0:02 bash
user    14038 30.0  0.0   9116  4228 pts/7    S+   13:52   0:00  \_ /bin/bash ./getSo.sh
user    14045  0.5  0.0   9356  5856 pts/7    S+   13:52   0:00       \_ openssl s_client -quiet -connect stackoverflow.com:443
user    14048  0.0  0.0  12404  3400 pts/7    R+   13:52   0:00       \_ ps --tty /dev/pts/7 ufw

total 0
lrwx------ 1 user user 64 jui  2 13:52 0 -> /dev/pts/2
l-wx------ 1 user user 64 jui  2 13:52 1 -> /dev/pts/2
lrwx------ 1 user user 64 jui  2 13:52 2 -> /dev/pts/2
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user    28110  0.0  0.0  11812  7144 pts/7    Ss   jui01   0:02 bash
user    14038 30.0  0.0   9632  4756 pts/7    S+   13:52   0:00  \_ /bin/bash ./getSo.sh
user    14051  0.0  0.0  12404  3332 pts/7    R+   13:52   0:00      \_ ps --tty /dev/pts/7 ufw

El openssl Le processus est terminé et les 3 FDs sont fermés.

Vous pourriez trouver ce script (moins condensé), avec des extensions boucle principale à l'adresse getSo.sh.txt , getSo.sh

1voto

Seena Fallah Points 383

Cela dépend entièrement du site web cible, mais par exemple, pour stack overflow, vous pouvez utiliser les commandes ci-dessous :

curl -X POST "https://stackoverflow.com/users/login" -H "Content-Type: application/x-www-form-urlencoded" -d "email=user@email.com" -d "password=password" -c cookie.txt

# verify your login
curl -b cookie.txt https://stackoverflow.com | grep YOUR_NAME
# OR check the status code from edit profile that should be 200 OK
curl -b cookie.txt https://stackoverflow.com/users/edit/YOUR_USER_ID -i 2>/dev/null

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X