Netcatでバイナリデータを送信するには、次の方法があります。
echo -e '\x80' | nc Host port
しかし、私はこのようにしたくありません、私が欲しいのはサーバーに接続することです:
nc 192.168.1.115 12345
次に、テキストを送信します。
aaaaaaaaaabbbbbbbbbbccccccccccc
そして、いくつかのバイナリデータを送信します。
0x80 0xF4 0x12
どうやってやるの?
注:このソリューションに従っている間は、特に明記されていない限り、単一のシェルセッションでコマンドを入力してください(または単一のスクリプトを使用してください)。これは、変数とファイル記述子を使用するため、元のセッション以外では直接利用できないためです。
一時的なfifoを作成します。一時ファイルを作成する正しい方法は、mktemp
を使用することです。残念ながら、fifoを作成することはできません。ただし、一時ディレクトリを作成できます。
tmpd=`mktemp -d`
tmpf="$tmpd"/fifo
mkfifo "$tmpf"
printf "%s\n" "$tmpf" # just to know the path to the fifo, it may be useful later
または、固定またはアドホックな場所に名前付きのfifoを手動で作成することもできます。それはあなた次第です。
Fifoを読み取り、データをサーバーに渡すバックグラウンドプロセスを作成します。
nc 192.168.1.115 12345 < "$tmpf" &
ncpid=$! # PID may be useful later
nc
が途中で終了しない場合は注意してください。接続自体にもサーバーにも問題がないと仮定すると、上記のバックグラウンドコマンドは、FIFOを介してデータの最初の束を送信し終えるまで接続されたままになります。しかし、開いたままにして複数の書き込みを受け入れたいので、FIFOを開いて閉じないでください(まだ)。
exec 3> "$tmpf"
これで、fifoを介して好きなものを送信でき、バックグラウンド接続が持続します。
echo abcd >&3 # sends text
echo -e '\x80' >&3 # sends "binary"
cat /etc/issue >&3 # sends file
cat >&3 # type whatever you want, terminate with Ctrl+D
パスがわかっている場合に限り、&3
ではなく、fifoへのパスを使用してこのコマンドを呼び出すことができます。パスがわかれば、同じまたはanotherシェルセッションからfifoに書き込むことができます。
cat > /path/to/the/fifo # type whatever you want, terminate with Ctrl+D
または、元のセッションと同様の方法で、別のセッションで記述子を開くことができます。どのようにfifoに書き込んでも、nc
はそれを単一の接続でリモートサーバーに渡します。
ただし、競合状態に注意してください。単一のシェルセッション内で単一の記述子を使用することは、それらを回避する良い方法です。
必要なデータを渡したら、nc
を終了し、元のシェルセッションで記述子を閉じます。
kill $ncpid
exec 3>&-
一部の状況では、バックグラウンドnc
を終了するには、後者のコマンド1つで十分です。それはあなたが何をしたか、そしてあなたがまだFIFOで何をしているかに依存します。このため、nc
を明示的に強制終了することを選択しました。
一時ディレクトリとそのコンテンツ(つまり、FIFO)を削除します。
rm -r "$tmpd"
最後のメモ:
最初にnc
をバックグラウンドに配置する必要はありません。これを1つのターミナルで実行し、別のターミナルから(そのパスを知っている)fifoに書き込むことができます。このようにして、その状態を簡単に監視できます。このソリューションをニーズに合わせて調整します。
事前に2つのデータを知っている場合は、次のことを試してください。
$ ( echo "aaabbbccc"; echo -en "\x80\xf4\x12" ) | hexdump -Cv
00000000 61 61 61 62 62 62 63 63 63 0a 80 f4 12 |aaabbbccc....|
0000000d
キーボードなどを使用してさらにコントロールしたい場合は、次の操作を試してください。
$ ( cat; cat | xxd -r -p ) | hexdump -Cv
aaabbbccc
80f412
00000000 61 61 61 62 62 62 63 63 63 0a 80 f4 12 |aaabbbccc....|
0000000d
注:押す必要があります Ctrl + D 各cat
...を終了するには、ここに入力しました( Returns-EOTは行の先頭になければなりません):
aaabbbccc
^D
80f412
^D