Socat 一直等待来自 stdin 的输入

Socat 一直等待来自 stdin 的输入

我需要在 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-LISTENUNIX)均未使用标准输入/输出,因此您在控制台上的输入不会向发送任何内容socat。(其中一个地址必须是STDIOSTDIN才能接受来自的键盘输入标准输入)。

此外,man socatsocat -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)。希望这能有所帮助。

相关内容