Читать данные UDP без новой строки от 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, как подсказал 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
но когда я попытался пропинговать доменное имя или> 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 ответ
Используйте опцию -b:
Устанавливает блок передачи данных [size_t]. Максимум байтов передается за шаг. По умолчанию 8192 байта.