Bash-使用socat的代理服务器



我正试图使用socat制作一个http代理,但我不知道为什么请求突然停止,网页中也没有任何内容。它只是将HTTP请求从bowser传输到web服务器。然后回复。

socat TCP4-LISTEN:666,fork EXEC:"./httproxy.sh"

将端口80重定向到666

iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 666

httproxy.sh

#!/usr/bin/env bash
function main() {
REQUEST_HEADERS=()
read -r line 
line=${line%%$'r'}
read -r REQUEST <<< "${line}"

while IFS= read -r line; do
line=${line%%$'r'}
[ -z "${line}" ] && break
REQUEST_HEADERS+=( "${line}" )
done

printf "${REQUEST}rn" &> request.log
for ((i = 0; i < ${#REQUEST_HEADERS[@]}; i++)); do
[[ "${REQUEST_HEADERS[$i]}" =~ ^Host:[[:space:]](.*) ]] && IP=${BASH_REMATCH[1]}
printf "${REQUEST_HEADERS[$i]}rn" &>> request.log
done
printf "$(cat request.log)rnrnrn" | nc ${IP} 80
}
main

响应:

HTTP/1.1 200 OK....
{HTTP Content}
Immediately after the content:
HTTP/1.1 405....

我已经用很多"Http"网页测试过了,有时html内容会到达。请帮帮我。

不要将变量放在printf格式字符串中打印。

代替

printf "$varrn"

进行

printf '%srn' "$var"

根据经验,用单引号将格式字符串括起来,这样可以防止任何无意的变量或进程替换。

当然,printf "$(cat request.log)rnrnrn"也是如此

为什么?

  • 如果var-(减号(开头,printf将把您的格式字符串理解为一个选项。HTTP GET请求永远不会发生这种情况
  • 如果var包含%字符,这在HTTP请求中非常常见,printf将把它解释为一个格式指令

此外,您可能在请求后添加了太多的空行rn。一个似乎足够了,因为你用已经以rn:结束的行来附加request.log

{ cat request.log; printf 'rn'; } | nc ...

(可能你甚至不需要添加任何空行,因为请求应该已经以一行结束(

相关内容

  • 没有找到相关文章

最新更新