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 データ (「abc.com」などの DNS クエリ) の末尾に改行文字がないことです。
誰でも私に何か助けてもらえますか?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
しかし、15 バイト以上または 15 バイト未満のドメイン名に ping を実行しようとすると、次の結果しか得られませんでした。
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...