在使用 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'
第一个参数是
,fork
继续socat
监听更多连接system:
比使用 shell 解释器更可取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
在 shell 命令中是可选的,但可以避免无用地留在 shell 中。
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