0

我在 bash 中制作了一个简单的脚本来充当 http 代理。

#!/usr/bin/env bash

trap "kill 0" SIGINT SIGTERM EXIT  # kill all subshells on exit

port="6000"

rm -f client_output client_output_for_request_forming server_output
mkfifo client_output client_output_for_request_forming server_output  # create named pipes

# creating subshell
(
    cat <server_output |
    nc -lp $port |  # awaiting connection from the client of the port specified
    tee client_output |  # sending copy of ouput to client_output pipe
    tee client_output_for_request_forming # sending copy of ouput to client_output_for_request_forming pipe
) &   # starting subshell in a separate process

echo "OK!"

# creating another subshell (to feed client_output_for_request_forming to it)
(
    while read line;  # read input from client_output_for_request_forming line by line
    do
        echo "line read: $line"
        if [[ $line =~ ^Host:[[:space:]]([[:alnum:].-_]*)(:([[:digit:]]+))?[[:space:]]*$ ]]
        then
            echo "match: $line"
            server_port=${BASH_REMATCH[3]}  # extracting server port from regular expression
            if [[ "$server_port" -eq "" ]]
            then
                server_port="80"
            fi
            host=${BASH_REMATCH[1]}  # extracting host from regular expression
            nc $host $server_port <client_output |  # connect to the server
            tee server_output  # send copy to server_output pipe
            break
        fi
    done

) <client_output_for_request_forming


echo "OK2!"

rm -f client_output client_output_for_request_forming server_output

我在第一个终端启动它。它输出OK!

在第二个我输入:

netcat localhost 6000

然后开始输入文本行,期望它们显示在第一个终端窗口中,因为有一个循环while read line。但什么都没有显示。

我做错了什么?我怎样才能让它工作?

4

1 回答 1

3

如果没有进程从client_outputfifo 读取,则后台管道未启动。由于读取的进程client_output直到从 读取一行才开始client_output_for_request_forming,因此您的进程被阻止。

于 2013-02-08T17:53:17.303 回答