私はこのコマンドをMac OS X El Capitanで実行する必要があります。このガイドで見つけました。エクリプスチェただし、それを実行しようとすると、socat
stdin からの入力を待機し続けます。
$ 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
ある必要があります。STDIO
STDIN
標準入力)。
さらに、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)を止めてください。お役に立てれば幸いです。