从socat读取UDP数据而不使用新行

从socat读取UDP数据而不使用新行,udp,newline,socat,Udp,Newline,Socat,我正在尝试使用socat侦听一些UDP端口,然后将通过UDP传入的数据写入文件 例如,我想在端口53上侦听: socat UDP-L:53,reuseaddr,pktinfo,fork EXEC:"./dns.sh" 我的dns.sh类似于: while read line; do thedate=`date +"%Y-%m-%d %H:%M:%S"` printf "%s %s %s %s\n" "$thedate" "$SOCAT_PEERADDR" "$SOCAT_PE

我正在尝试使用socat侦听一些UDP端口,然后将通过UDP传入的数据写入文件

例如,我想在端口53上侦听:

socat UDP-L:53,reuseaddr,pktinfo,fork EXEC:"./dns.sh"
我的dns.sh类似于:

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
然而,它没有起作用。根本原因似乎是,输入的UDP数据(dns查询,例如“abc.com”)末尾没有新行字符

有人能帮我吗?当UDP数据末尾没有新行字符时,如何使脚本成功读取它

或者有其他方法可以实现相同的目标(以我要求的相同格式输出数据)

谢谢

======更新1,按照arto的建议尝试了socat-b======= 我试过“socat-b”,但似乎不起作用

我运行命令:

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

root@log-server:~# 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
但当我尝试ping一个域名>15字节或<15字节时,我只得到:

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选项:

设置数据传输块[大小\u t]。顶多
每个步骤传输字节。默认值为8192字节。

谢谢arto。我试图添加-b选项,但似乎没有效果。有关更多详细信息,请参阅我的问题更新。