カスタムbash関数を使用したsocat双方向通信

カスタムbash関数を使用したsocat双方向通信

だから私はsocatが常に接続を聞き、最初のx行を取得し、メッセージで応答したいと思います。理想的には、カスタム関数を使用してそのロジックを処理したいのですが、これを達成する方法を見つけることはできません。

私のシナリオ:

client 1:

cat <(printf "line1\nline2\n") -|nc socat_server socat_port

client 2:

cat <(printf "line3\nline4\n") -|nc socat_server socat_port

私が得たいもの:line1、line3、およびクライアントメッセージ(例:EXIT)

私は以前試しました:

exec {fd}> >(my_custom_function)
socat tcp-listen:10000,reuseaddr,fork system:"head -n1>&$fd;echo EXIT;exit"

ただし、「無効なFD番号」が表示されます。この問題を解決する方法はありますか?

ベストアンサー1

の場合、{fd}> file値は$fd9より大きくなります。

このシェルコードを解釈するにはsystem:shell-codesocat呼び出しを使用します。sh

sh実装では、リダイレクト演算子で 9 より高い fd をサポートする必要はありません。実装もdash実装mkshもしません。また、ksh93(この構文をサポートするzshとbashの3つのシェルのうちの1つ)は、exec {fd}> file取得したfdにclose-on-execフラグを表示するため、そこから継承されませんsocat

したがって、ここでは10未満のfdを使用する必要があります。

exec 4> >(my_custom_function)
socat tcp-listen:10000,reuseaddr,fork system:"head -n1>&4;echo EXIT;exit"

または、zshなどのfds 9以降をサポートするシェルを呼び出します。

exec {fd}> >(my_custom_function)
socat tcp-listen:10000,reuseaddr,fork "exec:'zsh -c \"head -n1>&$fd;echo EXIT;exit\"'"

(でないksh93)。

おすすめ記事