繁体   English   中英

Bash - 使用 socat 的代理服务器

[英]Bash - Proxy server using 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}\r\n" &> request.log
    for ((i = 0; i < ${#REQUEST_HEADERS[@]}; i++)); do
        [[ "${REQUEST_HEADERS[$i]}" =~ ^Host:[[:space:]](.*) ]] && IP=${BASH_REMATCH[1]}
        printf "${REQUEST_HEADERS[$i]}\r\n" &>> request.log
    done
    printf "$(cat request.log)\r\n\r\n\r\n" | nc ${IP} 80
}

main

回复:

HTTP/1.1 200 OK....
{HTTP Content}

Immediately after the content:
HTTP/1.1 405....

我已经用大量的“Http”web 页面对其进行了测试,有时 html 内容会到达。 请帮我。

不要通过将变量放入printf格式字符串来打印变量。

代替

printf "$var\r\n"

printf '%s\r\n' "$var"

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

当然,同样适用于您的printf "$(cat request.log)\r\n\r\n\r\n"

为什么?

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

此外,您可能在请求后添加了太多空行\r\n 一个似乎就足够了,因为您 append request.log的行已经以\r\n结尾:

{ cat request.log; printf '\r\n'; } | nc ...

(有可能您甚至不必添加任何空行,因为请求应该已经以一个结尾)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM