socat
「ストリーム」に似たものでこれと他の多くのことを行うことができます
この基本的なアイデアを使用する何かがあなたのためにそれを行うはずです:
Machine1$ socat tcp-l:54321,reuseaddr,fork pty,link=/tmp/netchardev,waitslave
Machine2$ socat pty,link=/tmp/netchardev,waitslave tcp:machine1:54321
(例のページから適応)
暗号化したい場合は、 ssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork
のバリエーションを使用できます machine1 で、ssl:server-host:1443,cert=client.pem,cafile=server.crt
のようなもの machine2 で
(socat ssl の詳細)
メッセージパッシングは上位層で実装する必要があります。 TCP にはメッセージの概念がありません -- TCP 接続はオクテットのストリームを転送します。
nc
でリクエストしたようなものを実現できます および名前付きパイプについては、man mkfifo
を参照してください;または socat
をチェックしてください Alex Stragies が示すように。
中間層サービスがない場合の基本的な問題は、(1) 相手側でリッスンしている誰かがいない限りデータをネットワークに書き込むことができないこと、および (2) TCP 接続が双方向であることです。
誰かがリッスンしていない限り、ネットワークにデータを書き込むことはできないため、常にリスナーを開始する必要があります 前に データを送ることができます。 (メッセージ パッシング システムでは、メッセージを処理するプロセスが何らかのバッファリングを提供します。)
あなたの例は簡単に書き直すことができます:
-
最初に machine2 (宛先) でリスナーを開始します。
nc -l 1234 | ...some processing with the received data...
あなたの例では、これは
nc -l 1234 | cat
これはブロックされ、誰かがポート 1234 にデータを送信するのを待ちます。
-
次に、machine1 (ソース) からいくつかのデータを送信できます:
...make up some data... | nc machine2 1234
あなたの例では、これは
echo "Hello" | nc machine2 1234
受信したデータを何らかの方法で処理して応答したい場合は、シェルのコプロセッシング機能を使用できます。たとえば、これは非常に単純な (そして非常に頑固な) Web サーバーです:
#! /bin/bash
while :; do
coproc ncfd { nc -l 1234; }
while :; do
read line <&${ncfd[0]} || break
line="$(
echo "$line" |
LC_ALL=C tr -cd ' -~'
)"
echo >&2 "Received: \"$line\""
if [ "$line" = "" ]; then
echo >&${ncfd[1]} "HTTP/1.0 200 OK"
echo >&${ncfd[1]} "Content-Type: text/html"
echo >&${ncfd[1]} "Connection: close"
echo >&${ncfd[1]} ""
echo >&${ncfd[1]} "<title>It works!</title>"
echo >&${ncfd[1]} "<center><b>It works!</b></center>"
echo >&${ncfd[1]} "<center>-- $(date +%Y-%m-%d\ %H:%M:%S) --</center>"
break
fi
done
kill %%
sleep 0.1
done
配列 $ncfd
内のファイル記述子を使用して、スクリプトの本体とコプロセスの間で双方向通信がどのように実現されるかを確認してください .
nc のような基本的なプログラムを使用して 2 台のコンピューターを接続したいだけの場合は、/dev/tcp/<host>/<port>
との間でリダイレクトできます。 .
これらは実際のデバイスではなく、bash によって作成されたフィクションなので、cat /dev/tcp/foo/19
のようなものです。 動作しませんが、cat < /dev/tcp/foo/19