
Есть ли способ прослушивать и выполнять команду (для каждого соединения) во время переадресации портов с помощью socat? Нерабочий пример, чтобы было понятнее:
socat TCP-LISTEN:8080,reuseaddr, "exec:ls" fork tcp:localhost:80
решение1
Так?
socat tcp-listen:8080,reuseaddr,fork system:'ls; exec socat - tcp\:localhost\:80'
1-й параметр позволяет
,fork
оставатьсяsocat
в режиме ожидания для большего количества подключенийsystem:
предпочтительнееexec:
иметь интерпретатор оболочки и легко запускать дополнительную команду послеls
команды,что является новой
socat
командойкоторый будет иметь stdin/stdout, подключенный к выходу/входу удаленного клиента, и будет пересылать его снова двунаправленно к следующему месту назначения. Обратите внимание, что его
:
разделитель (и несколько других специальных символов) должны быть экранированы с помощью a,\
чтобы не путатьпервыйsocat
команда. Если эта строка становится более сложной, то проще просто выполнить такой скрипт:socat tcp-listen:8080,reuseaddr,fork exec:/path/to/myscript.sh
с
/path/to/myscript.sh
:#!/bin/sh ls exec socat - tcp:localhost:80
exec
в оболочке команда необязательна, но позволяет избежать бесполезного оставления ее вне оболочки.
socat
также экспортирует несколько собственных переменных, которые можно повторно использовать в скрипте, что можно проверить, например, так (при установленном соединении):
$ env - socat TCP-LISTEN:8080,reuseaddr,fork exec:printenv
SOCAT_PID=1057351
SOCAT_PPID=1057284
SOCAT_VERSION=1.7.4.1
SOCAT_SOCKADDR=127.0.0.1
SOCAT_SOCKPORT=8080
SOCAT_PEERADDR=127.0.0.1
SOCAT_PEERPORT=42970