在没有来自socat的新行的情况下读取UDP数据

时间:2013-08-02 04:37:44

标签: 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_PEERPORT" "$line" >> dns.txt
done

然而,它没有用。似乎根本原因是,输入UDP数据(dns查询,例如“abc.com”)最后没有新行字符。

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

或者我可以通过任何其他方式实现相同的目标(以我需要的相同格式输出数据)?

感谢。

======更新1,尝试了socat -b as arto建议======= 我试过“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域名时> gt; 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...

1 个答案:

答案 0 :(得分:0)

使用-b选项:

设置数据传输块[size_t]。最多 每步传输一个字节。默认值为8192个字节。