2015-01-27 5 views
1

명명 된 파이프를 사용하여 강력한 메시징 시스템을 생성하지 못한 후에 netcat을 사용하려고합니다. 내 수신 측이 새로운 리스너를 생성합니다, netcat을을 사용하여 포트에 수신 작은 스크립트하고 수신 된 메시지를 기반으로 스크립트를 실행합니다 : 그것은Netcat을 보내는 측에서 차단할 수 있습니까?

보다 더 복잡 아무것도 없을 것

# jh_listen.sh 
message=$(netcat -l 5555) 
nohup jh_listen.sh >/dev/null 2>&1 & 
cmd=${message%% *} 
parms=${message#* } 
nohup ${cmd} ${parms} >/dev/null 2>&1 & 

송신 측에를

echo "<command> <parms>" | netcat host 5555

내 문제는 연결을 닫고있는 청취자와 새로운 청취자 시작 사이에 짧은 간격이 있다는 것입니다. 청취 과정에서 메시지를받지 못하면 netcat에서 echo가 끝나고 즉시 메시지를 잃을 가능성이 있습니다. 뭔가를받을 때까지 데이터를 보낼 때 netcat 블록을 가질 수 있습니까? 나는 -q와 -w를 시도했지만, 내가 원하는 것은하지 않는다. 메시지 송신자가 메시지가 소비 될 때까지 차단할 수없는 경우 메시지 전송률이 높고 여러 호스트로부터 손실 될 가능성이 높습니다.

추가

가 보낸 사람이 내가 netcat을의 목록을 찾을 수는 없지만

msgno=1 

while [[ true ]]; do 
    rc=-1 
    retrycount=0 

    while [[ ${rc} -ne 0 ]]; do 
     echo "<command> <parms> ${msgno} ${retrycount}" | netcat host 5555" 
     rc=$? 
     echo "<command> <parms> ${msgno} ${retrycount}" >> local.log 
     ((retrycount++)) 
    done 
    ((msgno++)) 
done 

를 사용하여 위의 리스너에 대한 강력한 보낸 사람을 구현하기 위해 노력했습니다 차단하지를 해결하려면 정보 종료 코드는 연결이 가능할 경우에만 0으로 종료해야한다는 것을 나타냅니다. 작가의 마지막 부분에있는 local.log에서 볼 수있는 것은 내가 기대하는 것입니다. msgno는 각 전송 후에 증가하고 retrycount는 보낼 수없는 경우 가끔씩 증가합니다. 수신 측에서는 때때로 msgno 시퀀스에서 빈 메시지 및/또는 갭을 얻습니다. 나는 netcat이 아닌 다른 것을 설명하기가 어려울 때가 있는데, 때로는 stdin을 잃어 버리는 것처럼 보이고, 심지어 메시지를 보내지 않았다하더라도 0으로 끝나는 경우가있다. 대부분의 경우 잘 작동하는 것처럼 보이지만 충분하지 않습니다. 메시지가 통과 할 수 있도록 보장해야합니다.

답변

1
직접

하지 질문에 대한 답변,하지만 대신 netcatsocat를 사용할 수 있다면, 당신은 같은 것을 할 수있는 :

jh_listen.sh :

#/bin/bash 
socat TCP4-LISTEN:5555,fork EXEC:./jh_exec.sh 

jh_exec.sh :

를 송신 측에
#/bin/bash 
cmd=$(cat -) 
exec ${cmd} 

당신이 뭔가를 할 것이다 :

,
echo "touch foo" | socat - TCP4:hostname:5555 

위의 설정을 사용하면 jh_listen.sh이 포트 5555에서 계속 수신 대기하고 각 연결마다 하위 처리를 포크하여 jh_exec.sh 처리합니다. 이것은 기본적으로 포크 소켓 서버 설정입니다.

+0

내가 사용중인 Linux 배포판에는 socat가 없으므로 널리 지원되는 것을 원합니다. 여기서 지정한 명령이 소켓에서 계속 수신 대기합니까? 그것이 단발이고 나는 새로운 청취자를 알릴 필요가있을 것이고 netcat과 같은 배에있다. –

+1

@JimHudd 이것은 귀하의 코멘트에 응답 할 수 있습니다 [여기] (http://stackoverflow.com/questions/9596594/why-is-fork-needed-by-socat-when-connecting-to-a-web-server?answertab= 투표). socat 맨 페이지에서 _TCP-LISTEN_을 체크 아웃해야합니다. – Mikolaj

+0

@JimHudd,'socat'은 훨씬 더 고급이며'netcat'처럼 널리 지원됩니다.그냥 –

관련 문제