我正在尝试使用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...
答案 0 :(得分:0)
使用-b选项:
设置数据传输块[size_t]。最多 每步传输一个字节。默认值为8192个字节。