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