2014-10-21 3 views
0

내가 this script을 발견 netcat을 함께 만든 차단 프록시 찾고 : 예상대로 잘 작동유닉스 (Cygwin에서) FIFO 버퍼링

#!/bin/sh -e 

if [ $# != 3 ] 
then 
    echo "usage: $0 <src-port> <dst-host> <dst-port>" 
    exit 0 
fi 

TMP=`mktemp -d` 
BACK=$TMP/pipe.back 
SENT=$TMP/pipe.sent 
RCVD=$TMP/pipe.rcvd 
trap 'rm -rf "$TMP"' EXIT 
mkfifo -m 0600 "$BACK" "$SENT" "$RCVD" 
sed 's/^/ => /' <"$SENT" & 
sed 's/^/<= /' <"$RCVD" & 
nc -l -p "$1" <"$BACK" | tee "$SENT" | nc "$2" "$3" | tee "$RCVD" >"$BACK" 

합니다. 내가 사용하는 인코딩을 통과 따라서 실제 바이트에 밀접하게 볼 필요가 있기 때문에

, 나는 hexdump -vC를 사용하는 일부 라인을 변경하려고 :

#!/bin/sh -e 

if [ $# != 3 ] 
then 
    echo "usage: $0 <src-port> <dst-host> <dst-port>" 
    exit 0 
fi 

TMP=`mktemp -d` 
BACK=$TMP/pipe.back 
SENT=$TMP/pipe.sent 
RCVD=$TMP/pipe.rcvd 
trap 'rm -rf "$TMP"' EXIT 
mkfifo -m 0600 "$BACK" "$SENT" "$RCVD" 
(hexdump -vC | sed 's/^/ => /') <"$SENT" & 
(hexdump -vC | sed 's/^/<= /') <"$RCVD" & 
nc -l -p "$1" <"$BACK" | tee "$SENT" | nc "$2" "$3" | tee "$RCVD" >"$BACK" 

를 이제 더 이상 작동하지 않습니다. 사실, 이전 스크립트의 "실시간"기능을 잃어 버렸습니다. 전송 된 모든 바이트는 단일 일괄 처리로 덤프됩니다. 그리고 나서 다른 배치에서 수신 된 모든 바이트; 이 모든 것은 연결이 닫힌 후에 만 ​​가능합니다. 나는 버퍼링의 일종을 의심하고있어

파이프 (|)에서 발생,하지만 난 모르겠어요 방법 :

  1. 시험이 hypotesis;
  2. 실시간으로 다시 작동하도록 스크립트를 수정하십시오.

PS1. 나는 cygwin을 사용하고있다. PS2. sh --version 출력 :

GNU bash, version 4.1.10(4)-release (i686-pc-cygwin) 

편집 : | sed ... 부분 Removind

파이프 라인 연산자를 통해 내 의심을 증가, 실시간 기능을 다시 (즉에만 hexdump -vC <"$SENT"hexdump -vC <"$RCVD"을두고있다). 그러나 보낸 바이트와받은 바이트가 섞여 있기 때문에 출력이 혼란 스럽습니다. (?)

+0

'sed -u '를 사용하면 도움이됩니까? –

+1

예, 버퍼링은 hexdump 파이프 라인의 각 파이프에서 발생합니다. 아마도 '실시간으로'다시 작동시키는 방법이 없을 것입니다. –

+0

@EtanReisner 아니요, 그렇지 않았습니다. – rslemos

답변

0

아직도 나는 문제 버퍼링을 해결하기 위해 관리 할 수 ​​있겠지만, 나는 sed 불필요한 렌더링 할 수있는 hexdump 호출을 변경할 수 있습니다 :

#!/bin/sh -e 

if [ $# != 3 ] 
then 
    echo "usage: $0 <src-port> <dst-host> <dst-port>" 
    exit 0 
fi 

TMP=`mktemp -d` 
BACK=$TMP/pipe.back 
SENT=$TMP/pipe.sent 
RCVD=$TMP/pipe.rcvd 
trap 'rm -rf "$TMP"' EXIT 
mkfifo -m 0600 "$BACK" "$SENT" "$RCVD" 
hexdump -v -e '" => %08.8_Ax\n"' -e '" => %08.8_ax " 8/1 "%02x " " " 8/1 "%02x "' -e '" |" 16/1 "%_p" "|\n"' <"$SENT" & 
hexdump -v -e '"<= %08.8_Ax\n"' -e '"<= %08.8_ax " 8/1 "%02x " " " 8/1 "%02x "' -e '" |" 16/1 "%_p" "|\n"' <"$RCVD" & 
nc -l "$1" <"$BACK" | tee "$SENT" | nc "$2" "$3" | tee "$RCVD" >"$BACK" 

예, 새로운 hexdump 못생긴 보이지만 작동합니다.

나를위한이 질문은 이제 호기심을 위해서 열리고 있습니다. 나는 여전히 버퍼링 (?) 동작을 설명하고 수정하는 사람에게 "정답"을 알려 주려고합니다.