使用openssl
#!/bin/bash
shopt -s extglob
URL='https://stackoverflow.com/'
IFS=: read -r user pass < <(gpg -qd
后台运行openssl:
exec {wwwE}<> <(: - O)
exec {wwwI}<> <(: - b)
exec {wwwO}< <(
exec stdbuf -o0 openssl s_client -quiet -connect "$hst":443 <&$wwwI 2>&$wwwE)
osslpid=$!
doReq函数可以创建 2 个变量:$cookieand $htstatus和 3 个数组:$hthead, $htbody 和 $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[@]}"
}
登陆:
doReq /users/login POST "email=$user&password=$pass"
显示网站信息:
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//●/ \\U25cf }" ;;
esac ; done
现在可以随时运行doReq,因为连接保持打开状态。完成后,在退出之前,可以停止openssl并关闭您的 fd:
ls -l /dev/fd/ ; ps --tty $(tty) ufw
kill $osslpid
exec {wwwE}<&-
exec {wwwI}>&-
exec {wwwO}<&-
ls -l /dev/fd/ ; ps --tty $(tty) ufw
getSo.sh脚本内容:
#!/bin/bash
# getSo.sh - Sample HTTPS client w/Connection_Keep-Alive, using OpenSSL
# (C) 2020 - F-Hauri.ch
# Licensed by GNU GENERAL PUBLIC LICENSE Version 3
shopt -s extglob
URL='https://stackoverflow.com/'
IFS=: read -r user pass < <(gpg -qd <socred.gpg)
IFS=/ read -r _ _ hst _ <<<"$URL"
exec {wwwE}<> <(: - O)
exec {wwwI}<> <(: - b)
exec {wwwO}< <(
exec stdbuf -o0 openssl s_client -quiet -connect "$hst":443 <&$wwwI 2>&$wwwE)
osslpid=$!
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[@]}"
}
trUnicode() {
local lhs rhs chr;
local -n string=$1;
while [ "$string" ] && [ -z "${string//*&#*([0-9]);*}" ]; do
rhs=${string#*&#*([0-9]);}
lhs=${string%&#*([0-9]);$rhs}
chr=${string%;$rhs}
printf -v chr '\\U%X' "${chr#$lhs&#}"
printf -v chr %b "$chr"
string="$lhs $chr $rhs"
done
}
doReq /users/login POST "email=$user&password=$pass"
while true;do
doReq /
out=''
for ((i=${#htbody[@]};i--;)) ;do
line="${htbody[i]}"
case $line in
*badge1* )
startdiv=$i enddiv=$i
while [ "${htbody[startdiv]//*<div *}" ];do ((startdiv--));done
while [ "${htbody[enddiv]//*<\/div>*}" ];do ((enddiv++));done
line=""
for ((bdg=startdiv;bdg<=enddiv+1;bdg++)) ;do
line+="${htbody[bdg]//*([$'\n\r\t']} "
done
line=${line//>+([0-9])</><}
line=${line//<+([^>])>}
line=${line//+([ ])/ }
trUnicode line
out+=" $line"
;;
*"title=\"your reputation:"* )
line=${line#*reputation:}
out="Rep: ${line%%\"*} $out"
;;
esac
done
if [ "$out" ] ;then
[ "$out" = "$last" ] && printf '\e[A'
printf "%(%d %b %T)T " -1
echo "${out}"
last="$out"
printf -v tosleep '120-(%(%S)T%%20)' -1
tosleep=$((tosleep))
read -sn 1 -rt ${tosleep:1} _ && break
penalty=0
else
(( penalty++ > 10 )) && break
unset cookie
doReq /users/login POST "email=$user&password=$pass"
read -rt 0 _ && break
fi
done
ls -l /dev/fd/
ps --tty "$(tty)" ufw
kill $osslpid
exec {wwwE}<&-
exec {wwwI}>&-
exec {wwwO}<&-
ls -l /dev/fd/
ps --tty "$(tty)" ufw