2013-08-02 1 views
-1

socat을 사용하여 일부 UDP 포트에서 수신 대기하고 데이터를 UDP를 통해 파일에 기록하려고합니다.socat에서 새 줄이없는 UDP 데이터를 읽습니다.

예를 들어, 나는 53 번 포트에 듣고 싶은 :

while read line; do 
    thedate=`date +"%Y-%m-%d %H:%M:%S"` 
    printf "%s %s %s %s\n" "$thedate" "$SOCAT_PEERADDR" "$SOCAT_PEERPORT" "$line" >> dns.txt 
done 

그러나, 그것은 작동하지 않았다 :

socat UDP-L:53,reuseaddr,pktinfo,fork EXEC:"./dns.sh" 

내 dns.sh은 같다. 근본적인 원인은 입력 UDP 데이터 (예 : "abc.com"과 같은 DNS 검색어)는 마지막에 새 줄 문자가 없음을 나타냅니다.

누구든지 내게 어떤 도움을 줄 수 있습니까? UDP 데이터가 새로운 행 문자를 가지지 않을 때 성공적으로 그것을 읽도록 스크립트를 만드는 방법?

또는 동일한 목표 (필요한 동일한 형식으로 데이터 출력)를 얻을 수있는 다른 방법이 있습니까?

감사합니다.

====== 1 업데이트, socat -b를 arto로 제안했습니다. ======= "socat -b"를 시도했지만 작동하지 않는 것 같습니다.

socat -b 15 UDP-L:53,reuseaddr,pktinfo,fork EXEC:"./dns.sh" & 

스크립트 dns.sh했다 :

는 내가 명령을 실행

[email protected]:~# cat dns.sh 
#!/bin/bash 

firstdate=`date +"%Y-%m-%d %H:%M:%S"` 
printf "%s %s %s %s\n" "$firstdate" "$SOCAT_PEERADDR" "$SOCAT_PEERPORT" "UDP incoming... " >> dns.txt 

while read -t 3 line; do 

    thedate=`date +"%Y-%m-%d %H:%M:%S"` 
    printf "%s %s %s %s\n" "$thedate" "$SOCAT_PEERADDR" "$SOCAT_PEERPORT" "$line" >> dns.txt 
done 

을하지만 도메인 이름 중> 15 바이트 < 15 바이트, 난 단지 ping을 시도 할 때 가지고 :

2013-08-02 21:12:55 192.168.0.142 49899 UDP incoming... 
2013-08-02 21:12:59 192.168.0.142 49899 UDP incoming... 
2013-08-02 21:13:03 192.168.0.142 49899 UDP incoming... 

답변

0

사용 -b 옵션 :

데이터 전송 블록 [size_t]을 설정합니다. 한 단계 당 바이트가 전송됩니다. 기본값은 8192 바이트입니다.

+0

감사합니다. -b 옵션을 추가하려고했지만 작동하지 않는 것 같습니다. 자세한 내용은 질문에 대한 내 업데이트를 참조하십시오. – user1748640

관련 문제