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будетнетразветвление перед началом основного цикла прослушивания.

Эта -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?), будет использовать сокет/файл как для чтения, так и для записи.

Итак, если вы пытаетесь подключить порт TCP на 127.0.0.1:2376 к имени файла (выступая в роли сокета 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в начале, чтобы отобразить шестнадцатеричный дамп проходящих данных). Наконец, «симулируйте» TCP-клиента, подключающегося к TCP-порту с помощью (3)

socat -d STDIO TCP:127.0.0.1:2376

В конце концов, остановитесь на (1) и (3). Надеюсь, это поможет.

Связанный контент