Читать данные 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 байта.

Другие вопросы по тегам