Socat は stdin からの入力を待ち続けます

Socat は stdin からの入力を待ち続けます

私はこのコマンドをMac OS X El Capitanで実行する必要があります。このガイドで見つけました。エクリプスチェただし、それを実行しようとすると、socatstdin からの入力を待機し続けます。

$ socat -d TCP-LISTEN:2376,range=127.0.0.1/32,reuseaddr,fork UNIX:/var/run/docker.sock
I'm writing here, and I don't know why socat let me do this

^C$

プロンプトに戻るにはCtrl+を押す必要があります。何が間違っているのでしょうか?C

答え1

おそらく著者はそれを試したことがないのでしょう。マニュアルこのオプションについて次のように述べていますfork

接続を確立した後、子プロセスでそのチャネルを処理し、親プロセスがリッスンするかループで接続することによって、さらに接続を生成しようとし続けます (例)。

それはsocatつまりないメインの listen ループを開始する前に fork します。

この-dオプションは、詳細度を上げるだけです ( のようにdebug)。

要約:socatそれはできません。

ソース ツリーには、socatバックグラウンドで起動するヘルパー スクリプトが含まれています。目的に合わせて調整できます。このスクリプトは私が書いたものではありません!

#! /bin/sh
# source: daemon.sh
# Copyright Gerhard Rieger 2001
# Published under the GNU General Public License V.2, see file COPYING

# This script assumes that you create group daemon1 and user daemon1 before.
# they need only the right to exist (no login etc.)

# Note: this pid file mechanism is not robust!

# You will adapt these variables
USER=daemon1
GROUP=daemon1
INIF=fwnonsec.domain.org
OUTIF=fwsec.domain.org
TARGET=w3.intra.domain.org
INPORT=80
DSTPORT=80
#
INOPTS="fork,setgid=$GROUP,setuid=$USER"
OUTOPTS=
PIDFILE=/var/run/socat-$INPORT.pid
OPTS="-d -d -lm"    # notice to stderr, then to syslog
SOCAT=/usr/local/bin/socat

if [ "$1" = "start" -o -z "$1" ]; then

    $SOCAT $OPTS tcp-l:$INPORT,bind=$INIF,$INOPTS tcp:$TARGET:$DSTPORT,bind=$OUTIF,$OUTOPTS </dev/null &
    echo $! >$PIDFILE

elif [ "$1" = "stop" ]; then

    /bin/kill $(/bin/cat $PIDFILE)
fi

答え2

socatは、2つのアドレスの入出力を接続します。指定した2つのアドレス(TCP-LISTENおよびUNIX)のうち、いずれも標準入出力を使用しないため、コンソールに入力しても には何も送信されません。(キーボード入力を から受け取るには、アドレスの1つが または でsocatある必要があります。STDIOSTDIN標準入力)。

さらに、man socatまたは、が存在しない socat -hことが明らかになりますが、 、、、など、他のものは存在します。おそらく、そのオプションは の所有物に存在します(投稿が 1 年以上前のものなので...)。UNIX:UNIX-CLIENT:UNIX-CONNECT:UNIX-LISTEN:UNIX-RECV:UNIX-RECVFROM:socat

socatまた、これらのオプションの詳細をあまり見ずに、出力1つのアドレスと入力また、一般的には双方向です (出力から入力、および入力から出力)。したがって、Unix ソケットのもう一方の端にあるもの (Eclipse プロセスなど) は、ソケット/ファイルを使用して読み取りと書き込みの両方を行います。

したがって、127.0.0.1:2376 の TCP ポートをファイル名 (Unix ソケットとして動作) に接続しようとしている場合、データはソケットが開いている間のみ渡される可能性があります。テストはしていませんが、別のプロセスで Unix ソケットの「偽の」リスナーを実行できます。例: (1)

socat -d UNIX-LISTEN:/var/run/docker.sock STDIO

そして、例えば(2)のように「あなたの」TCPメディエーターを用意する。

socat -d TCP-LISTEN:2376,range=127.0.0.1/32,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock

(最初にオプションを追加して-x -v、通過するデータの16進ダンプを表示する場合もあります)。最後に、(3)を使用してTCPポートに接続するTCPクライアントを「シミュレート」します。

socat -d STDIO TCP:127.0.0.1:2376

最後に、(1)と(3)を止めてください。お役に立てれば幸いです。

関連情報