Подключаюсь к чему-нибудь /usr/bin/openssl s_client -connect <host>:<port> и могу обмениваться данными с сервером. Возможно ли как-то подробнее узнать о состоянии соединения? Чтобы это можно было использовать в баш скриптах...
Например сейчас я из скрипта запускаю openssl ... & и sleep 2 секунды, после чего считаю, что соединение установилось и можно обмениваться данными. Но это же не правильно. В идеале, хочу сделать так, что, когда openssl сообщит, что соединение состоялось, то вызывалась баш-функция on_sockopen() { }, и когда соединение разрывалось - вызывалась on_sockclose() { }. Вообще будет замечательно, если еще до кучи можно будет вызывать on_sockread () { } когда есть данные для приема, и on_sockwrite () { } когда данные были отправлены (приняты) удаленной стороной.
sockopen() {
[ -e "/tmp/$name" ] && rm --recursive "/tmp/$name"
mkdir --parents "/tmp/$name"
mkfifo "/tmp/$name/i"
mkfifo "/tmp/$name/o"
/usr/bin/openssl s_client -connect "$1:$2" > "/tmp/$name/i" < "/tmp/$name/o" &
echo $! > "/tmp/$name/pid"
exec 3<"/tmp/$name/i"
exec 4>"/tmp/$name/o"
}
sockread() {
read -r -t 2 $2 < "/tmp/$sockname/i" || return 1
}
sockwrite() {
name="$1"
shift
echo -n "$*" > "/tmp/$name/o" || return 1
}
sockclose() {
exec 3<&-
exec 4<&-
kill $(< "/tmp/$1/pid") >/dev/null 2>&1
rm --recursive "/tmp/$1"
}
Сейчас имеется такая «библиотека», но понятное дело, что реализована она в корне не корректно. Это не события, это команды. Использовать их можно для простенького управления соединением, а-ля:
sockname=".sock-test"
sockopen $sockname "www.google.com" 443
if [[ $? == 0 ]]; then
sockwrite $sockname "GET / HTTP/1.0"$'\x0d\x0a'
sockwrite $sockname "Host: www.google.com"$'\x0d\x0a'
sockwrite $sockname $'\x0d\x0a'
fi
while true;
sockread $sockname data || continue
echo $data
done
Но а я хочу сделать _нормальную_ баш-библиотеку для управления сокетами на коллбэках, вызывая on_* функции... но вот про openssl не знаю ничего: он как-то предоставляет информацию о передаваемых данных, состоянии соединения?