Socat 一直等待來自 stdin 的輸入

Socat 一直等待來自 stdin 的輸入

我需要在 Mac OS X El Capitan 上執行此命令。我在本指南中找到了關於日食車。但是,當我嘗試這樣做時,我socat會一直等待來自標準輸入的輸入。

$ 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:, 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)。希望有幫助。

相關內容