bash で HTTPS の POST を模写するテクニック例。Content-Lentgth をちゃんと計算させることが大事。
HTTP の場合は openssl でなく nc “${SERVER}” “${PORT}” でよいと思う。この場合 sleep も要らない。
openssl の部分でレスポンスの悪いサーバーの場合 sleep 1 では足りないかもしれない。その場合は sleep 2 など増やして試してみる。逆にレスポンスのよいサーバーでは usleep 500000 (0.5 秒) がいいかもしれない。
#!/bin/bash
USERNAME="hoge"; PASSWORD="fuga"
SERVER="example.com"; PORT="443"
CONTENT="username=${USERNAME}&password=${PASSWORD}"
CONTENTLENGTH=$( expr "$( wc -c <<< "${CONTENT}" )" - 1 )
RESPONSE=$( ( echo -ne "POST /login.php HTTP/1.0\nContent-Length: ${CONTENTLENGTH}\n\n${CONTENT}" ; sleep 1 ) | openssl s_client -connect ${SERVER}: ${PORT} 2>&1 )
COOKIE=$( sed -n 's/^Set-Cookie: \(.*\)$/\1/p' <<< "${RESPONSE}" )
echo "COOKIE: ${COOKIE}"
exit 0
