編集する:

編集する:

送信できるバイナリファイルがありますnetcat

$ nc -l localhost 8181 < my.dat

ファイルには次の内容が含まれています。

$ xxd my.dat
0000000: 0006 3030 3030 4e43                      ..0000NC

私が本当にしたいのは、16進文字列を直接送信することです。私はこれを試しました:

$ echo '0006303030304e43' | nc -l localhost 8181

しかし、上記のコマンドはASCII文字列をnc

答え1

私が使うものは-アル字型そして-血スイッチxxd:

$ echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181

インスピレーションを得た@Gillesの答えのおかげで、Perlのバージョンは次のようになります。

$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181

答え2

xxdorのないソリューションは次のとおりですperl

echoシェルの組み込み機能がそれをサポートしている場合(bashそしてzshサポートされていますがサポートされていません)dash)、正しいバックスラッシュエスケープを使用する必要があります。

echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181

あなた/bin/echoが持っているならGNUコアツール(Linuxシステムではほぼ標準)またはbusyboxで使用できます。

以下を使用すると、sedエスケープパターンを作成できます。

$ echo '0006303030304e43' | sed -e 's/../\\x&/g'
\x00\x06\x30\x30\x30\x30\x4e\x43

包括的な:

echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181

答え3

持っていればxxd簡単です。 16進数を変換できます。

echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181

POSIXツールのみを使用して16進数をバイナリに変換する合理的で迅速な方法はないと思います。 Perlでは、これを非常に簡単に実行できます。次のスクリプトは、16進数ではなく入力文字を無視し、16進数を2進数に変換します。入力行に奇数の16進数が含まれているとエラーが発生します。

#!/usr/bin/env perl
$^W = 1;
$c = undef;
while (<>) {
    tr/0-9A-Fa-f//cd;
    if (defined $c) { warn "Consuming $c"; $_ = $c . $_; $c = undef; }
    if (length($_) & 1) { s/(.)$//; $c = $1; }
    print pack "H*", $_;
}
if (!eof) { die "$!"; }
if (defined $c) { warn "Odd number of hexadecimal digits"; }

本当にPOSIXに固執する必要がある場合(たとえば、組み込みデバイスで)、次のものを使用することをお勧めします。Base6416進の代わりに。あなたはそれを使用することができますウッドコードBase64をデコードします。入力にはヘッダー形式と次のように生成された末尾の行が必要です。ユーエンコーディング、生のBase64にすることはできません。

uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF

答え4

これに似ています:https://stackoverflow.com/questions/1604765/linux-shell-scripting-hex-string-to-bytes/47253233#47253233

標準入力で様々な変換を行い、その結果を標準出力に出力するツールを作成しました。cryptocli ddこれらの変換のみが実行され、他の操作は実行されません。

echo -n 0006303030304e43 | cryptocli dd -decoders hex | nc -l localhost 8081

あなたのために働きます。

このツールはオープンソースで、ここにあります。https://github.com/tehmoon/cryptocli

編集する:

私のツールを使用して16進数で直接エンコードすることもできます。

cat my.dat | cryptocli dd -encoders hex | nc -l localhost 8081

関連情報