シェルスクリプトから POST

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
タイトルとURLをコピーしました