我需要在 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
意味着不是在启动主监听循环之前先 fork。
该-d
选项仅增加详细程度(如debug
)。
tl;dr: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
连接两个地址的输入/输出。您提供的两个地址(TCP-LISTEN
和UNIX
)均未使用标准输入/输出,因此您在控制台上的输入不会向发送任何内容socat
。(其中一个地址必须是STDIO
或STDIN
才能接受来自的键盘输入标准输入)。
此外,man socat
或socat -h
显示UNIX:
不存在,但其他人确实存在,即: ,,,,。UNIX-CLIENT:
也许这个选项存在于您的观点中(因为该帖子已有 1 年多了……)。UNIX-CONNECT:
UNIX-LISTEN:
UNIX-RECV:
UNIX-RECVFROM:
socat
此外,无需过多考虑这些选项的细节,只需记住socat
连接输出一个地址输入另一方;并且一般而言这是双向的(输出到输入以及输入到输出)。因此,Unix 套接字的另一端(Eclipse 进程?)上的任何内容都将使用套接字/文件进行读取和写入。
因此,如果您尝试将 127.0.0.1:2376 上的 TCP 端口连接到文件名(充当 Unix 套接字),那么数据很可能只会在套接字打开时才被传递。我没有测试 - 但您可以使用另一个进程运行 Unix 套接字的“假”侦听器,例如 (1)
socat -d UNIX-LISTEN:/var/run/docker.sock STDIO
然后让“你的” TCP 中介程序作为示例 (2)
socat -d TCP-LISTEN:2376,range=127.0.0.1/32,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock
-x -v
(可以在开始时添加选项,以显示通过的数据的十六进制转储)。最后,使用(3)“模拟”连接到 TCP 端口的 TCP 客户端
socat -d STDIO TCP:127.0.0.1:2376
最后,停止(1)和(3)。希望这能有所帮助。