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