-1

我正在尝试使用 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...
4

1 回答 1

-1

使用 -b 选项:

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

于 2013-08-02T09:47:02.337 回答