
socat でポート転送中に、コマンドをリッスンして実行する方法はありますか (接続ごとに)? わかりやすくするために、動作しない例を示します。
socat TCP-LISTEN:8080、reuseaddr、「exec:ls」フォーク 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 をリモートクライアントの出力/入力に接続し、次の宛先に双方向で転送します。
:
区切り文字 (および他のいくつかの特殊文字)\
は、初め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