我需要在 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-LISTEN
和UNIX
)都不使用標準輸入/輸出,因此您在控制台上的鍵入不會向 發送任何內容socat
。 (其中一個位址必須是STDIO
或STDIN
接受您的鍵盤輸入標準輸入)。
此外,man socat
或socat -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)。希望有幫助。