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
의지~ 아니다메인 청취 루프를 시작하기 전에 포크하십시오.
이 -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
(게시물이 1년 이상 되었기 때문에...).
socat
또한 해당 옵션 에 대해 너무 자세히 알아보지 않고도산출하나의 주소 중입력다른 것; 일반적으로 이는 양방향(출력-입력 및 입력-출력)입니다. 따라서 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)을 중지합니다. 도움이 되길 바랍니다.