0

現在、ブロードキャスト UDP パケットを送信するシェル スクリプトを作成しようとしています。私の問題は、エコーが代わりに引数を出力していることです。その理由はわかりません。これが私のスクリプトです:

#!/bin/bash
# Script
var1="\xdd\x02\x00\x13\x00\x00\x00\x10\x46\x44\x30\x30\x37\x33\x45\x31\x39\x39\x45\x43\x31\x42\x39\x34\x00"
var2="\xdd\x00\x0a\x\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x02"

echo -ne $var1 | socat - UDP4-DATAGRAM:255.255.255.255:5050,broadcast
echo -ne $var2 | socat - UDP4-DATAGRAM:255.255.255.255:5050,broadcast

Wireshark を使用すると、スクリプトが -ne を文字として出力し、各 \xHH を対応する ASCII 文字に変換していないことがわかります。

ありがとう!

4

2 に答える 2

0

私は自分の問題を理解しました。bash ./script.sh の代わりに sh ./script.sh を使用してスクリプトを実行していたことが判明しました。

于 2015-08-02T14:42:07.997 に答える
0

echo-ne実装は、コマンド オプション ( など) を使用するか、単に出力する文字列の一部として扱うか、および/または出力する文字列のエスケープ シーケンスを解釈するかについて、どうしようもなく一貫性がありません。bash のビルトイン バージョンとecho(推測では) /bin/echo のバージョンに違いがあるようです。また、bash の異なるバージョン間でも異なることがわかりました。

自明でないものに対して一貫した動作が必要な場合は、printf代わりにecho. 正しく使用するのは少し複雑ですが、なんらかのecho理由で変更されたためにスクリプトがランダムに壊れないため、IMO は価値があります。注意が必要なprintfのは、最初の引数が特殊であることです。これは、すべてのエスケープ シーケンスが解釈されるフォーマット文字列であり、シーケンス%は残りの引数を追加する方法を示します。また、特に指示しない限り、最後に改行を追加しません。この場合、フォーマット文字列で 16 進コードを指定するだけです。

printf "$var1" | socat - UDP4-DATAGRAM:255.255.255.255:5050,broadcast
printf "$var2" | socat - UDP4-DATAGRAM:255.255.255.255:5050,broadcast
于 2015-08-02T21:35:34.210 に答える