2014-12-21 6 views
4

엄격한 bash 스크립팅을 사용하여 일부 기본 TCP 클라이언트 통신을 시도하고 있습니다. 내 처분에 netcat을이 있고 그래서 나는 지금까지이 루프를 작성했습니다 :Netcat TCP 프로그래밍 (Bash 포함)

nc 10.0.0.104 4646 | while read line 
do 
    if [ "$line" == '{"cmd": 1}' ] 
    then 
     # Send text back to the TCP server 
     echo '{"error": 0}' 
    fi 
done 

는 스크립트가 성공적으로 내가 사용 서버 응용 프로그램에 연결할 수 있지만 다시 텍스트를 보내는 방법을 알아내는 어려움을 겪고있어 netcat 프로세스.

답변

2

Bash≥4하면 coproc을 사용할 수 있습니다 :이 임시 FIFO를를 사용하는 것을 피한다

#!/bin/bash 

coproc nc { nc 10.0.0.104 4646; } 

while [[ $nc_PID ]] && IFS= read -r -u${nc[0]} line; do 
    case $line in 
     ('{"cmd": 1}') 
      printf >&${nc[1]} '%s\n' '{"error": 0}' 
      ;; 
     (*) 
      printf >&2 '%s\n' "Received line:" "$line" 
      ;; 
    esac 
done 

. coproc이 없다면, 남은 유일한 옵션은 FIFO를 명시 적으로 사용하는 것입니다. 다음은 예입니다 :이를 위해

#!/bin/bash 

mkfifo fifo_in 

while IFS= read -r line; do 
    case $line in 
     ('{"cmd": 1}') 
      printf '%s\n' '{"error": 0}' 
      ;; 
     (*) 
      printf >&2 '%s\n' "Received line:" "$line" 
      ;; 
    esac 
done < <(nc 10.0.0.104 4646 < fifo_in) > fifo_in 

, 당신은 FIFO의 생성 및 삭제를 관리해야합니다 : 당신은 다음, 생성 거기에, mktemp에 임시 디렉토리를 만들 수 trap 스크립트를 FIFO가 필요합니다 그래서 출구에서 모든 것이 청소됩니다.


/dev/tcp

을 배시가 순 리디렉션을 지원하도록 컴파일 된 경우는, 당신은 nc의 및 전부 FIFO를하고 coprocesses 제거 할 수 있습니다

#!/bin/bash 

# open TCP connection, available on file descriptor 3 
exec 3<> /dev/tcp/10.0.0.104/4646 || exit 

while IFS= read -r -u3 line; do 
    case $line in 
     ('{"cmd": 1}') 
      printf >&3 '%s\n' '{"error": 0}' 
      ;; 
     (*) 
      printf >&2 '%s\n' "Received line:" "$line" 
      ;; 
    esac 
done 

이 매우 가능성이 달콤한입니다 해결책!

+1

좋은 물건. O.P.가 bash 4를 사용할 수없는 경우, 이러한 기능은 몇 년 동안 ksh에있었습니다. 하지만 그것은 ksh의 어떤 버전이 사용 가능한지에 따라 다르지만 테스트할만한 가치가 있습니다. O.P.는 프로덕션 환경에 새로운 내용을 설치하지 않아도됩니다. 모두에게 행운을 빕니다. – shellter

+0

좋은 답변 - 내 투표 :-) –