-1

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...
4

1 に答える 1

-1

-b オプションを使用します。

データ転送ブロック [size_t] を設定します。ステップごとに最大バイト数が転送されます。デフォルトは 8192 バイトです。

于 2013-08-02T09:47:02.337 に答える