web-dev-qa-db-ja.com

ポートがメッセージを受信したときに実行するスクリプトを設定する方法

シェルスクリプトを特定のポートでリッスンする方法を知りたいです(おそらくnetcatを使用していますか?)。うまくいけば、メッセージがそのポートに送信されると、スクリプトがメッセージを記録してから関数を実行します。

例:

  1. コンピューター1のスクリプトはバックグラウンドで実行されており、スクリプトは着信トラフィックに対してポート1234を開きました

  2. コンピューター2はメッセージ「hello world」をコンピューター1のポート1234に送信します

  3. コンピューター1のスクリプトは、メッセージ "hello world"を変数$ MESSAGEに記録します

  4. 変数$ MESSAGEが設定されたため、スクリプトは関数を実行します

これを寄付するにはどうすればよいですか?

12
Daniel

socatで可能になるはずです。

このようなスクリプト「getmsg.sh」を記述して、stdin経由で1つのメッセージを受信します。

#!/bin/bash
read MESSAGE
echo "PID: $$"
echo "$MESSAGE"

次に、このsocatコマンドを実行して、ポート7777での各TCP接続のスクリプトを呼び出します。

socat -u tcp-l:7777,fork system:./getmsg.sh

別のシェルからテストメッセージを送信します。

echo "message 1" | netcat localhost 7777
12
rudimeier

UCSPI-TCPの方法

Netcat以外のツールセットがあります。それらのいくつかを使用する方法を次に示します。これらはすべて、serviceを実行するfuncスクリプトの存在を想定しています。

#!/ bin/sh 
 while read -r MESSAGE 
 do 
 echo 1>&2 "$ {TCPREMOTEIP}" "$ {TCPREMOTEPORT}" rx "$ {MESSAGE}" 
 func 
完了

TCPREMOTEIPおよびTCPREMOTEPORT環境変数は、UCSPI-TCPプロトコルによって定義されます。

スクリプトは、さまざまなツールセットを使用してTCP接続ごとに個別のプロセスとして生成されます。以下では、ツールは短いスクリプト内で使用されるものとして示されています。このようなスクリプトは、従来runは、daemontoolsファミリのサービスマネージャの下で実行する方法です。もちろん、直接呼び出すこともできます。

バーンスタインucspi-tcp

Daniel J. Bernsteinのucspi-tcpを使用すると、tcpserverserviceスクリプトを生成します。

#!/ bin/sh -e 
 exec tcpserver -v -P -R -H -l 0 0.0.0.0 7777 ./service

Bernstein ucspi-tcpのIPv6対応拡張バージョンがあります。 Erwin Hoffmanの場合、tcpserverはIPv4とIPv6の両方を1つで処理しようとし(オペレーティングシステムがこれをサポートしている場合はサポートしていません)、serviceスクリプトを生成します。

#!/ bin/sh -e 
 exec tcpserver -v -P -R -H -l 0 :: 0 7777 ./service

Bercot s6-networking、s6、およびexecline

Laurent Bercotのs6-networkingを使用すると、s6-tcpserver4s6-tcpserver6はIPv4とIPv6を別々に処理し、serviceスクリプトを生成します。

#!/ command/execlineb 
 s6-tcpserver4 -v 0.0.0.0 7777 
 ./ service
#!/ command/execlineb 
 s6-tcpserver6 -v :: 0 7777 
 ./ service

s6-tcpserver-accessの直前のチェーンにs6-applyuidgid./serviceなどのツールを挿入することで、より複雑なサーバーを構築できます。

nosh UCSPIツール

Noshツールセットを使用すると、tcp-socket-listenはTCPソケットでリッスンし、オペレーティングシステムがサポートしている場合はIPv4とIPv6を同時に処理し、tcp-socket-acceptにチェーンします。 serviceスクリプトを生成します:

#!/ bin/nosh 
 tcp-socket-listen --combine4and6 :: 7777 
 tcp-socket-accept --verbose --localname 0 
 ./ service

または、OpenBSDなどのオペレーティングシステムで、2つの別個のプロセスを実行します。

#!/ bin/nosh 
 tcp-socket-listen 0.0.0.0 7777 
 tcp-socket-accept --verbose --localname 0 
 ./ service
#!/ bin/nosh 
 tcp-socket-listen :: 7777 
 tcp-socket-accept --verbose --localname :: 
 ./ service

ucspi-socket-rules-checksetuidgidなどのツールをチェーンに挿入することで、より複雑なサーバーを構築できます。

#!/ bin/nosh 
 tcp-socket-listen --combine4and6 :: 7777 
 setuidgid unprivileged-user 
 tcp-socket-accept --verbose --localname 0 
 ucspi-socket-rules-check --verbose 
 ./ service

Pape ipsvd

Gerrit Papeのipsvdを使用すると、tcpsvdserviceスクリプトを生成します。

#!/ bin/sh -e 
 exec tcpsvd -v 0.0.0.0 7777 ./service

UCSPI-UDP

共通のserviceスクリプトは、標準入力がstreamソケットの場合に処理できます。しかし、TCP=を明示的に指定していません。

前述のツールキットの一部を使用して、UDPサーバーをビルドする方法と同様の方法でUDPサーバーをビルドすることができますが、TCPサーバーを参照してください(noshのudp-socket-listenを参照))、ビルドは難しいです標準入力がdatagramソケットである場合、シェルのビルトインは必ずしも適切に対応しないため、シェルスクリプトを含む実際のサービスプログラム。

参考文献

  • プロトコル:
  • ツールセット:
    • ダニエルJ.バーンスタイン。 cspi-tcp。 cr.yp.to。
    • s6-n​​etworking 。ローラン・ベルコット。 skarnet.org。
    • s6 。ローラン・ベルコット。 skarnet.org。
    • ジョナサン・デ・ボイン・ポラール(2016)。 noshソフトウェア。
    • ipsvd 。ジェリット・パプ。 smarden.org。
  • リファレンスマニュアル:
    • ダニエルJ.バーンスタイン。 tcpserverプログラム。 ucspi-tcp。
    • アーウィン・ホフマン。 tcpserverucspi-tcp6。 fehcom.de。
    • s6-tcpserver4 。ローラン・ベルコット。 s6-networking。 skarnet.org。
    • s6-tcpserver6 。ローラン・ベルコット。 s6-networking。 skarnet.org。
    • s6-tcpserver-access 。ローラン・ベルコット。 s6-networking。 skarnet.org。
    • s6-applyuidgid 。ローラン・ベルコット。 s6。 skarnet.org。
    • ジョナサン・デ・ボイン・ポラール(2016)。 tcpservernoshガイド。ソフトウェア。
    • ジョナサン・デ・ボイン・ポラール(2016)。 tcp-socket-listennoshガイド。ソフトウェア。
    • ジョナサン・デ・ボイン・ポラール(2016)。 tcp-socket-acceptnoshガイド。ソフトウェア。
    • ジョナサン・デ・ボイン・ポラール(2016)。 ucspi-socket-rules-checknoshガイド。ソフトウェア。
    • ジョナサン・デ・ボイン・ポラール(2016)。 setuidgidnoshガイド。ソフトウェア。
    • ジョナサン・デ・ボイン・ポラール(2016)。 udp-socket-listennoshガイド。ソフトウェア。
    • tcpsvdipsvd。ジェリット・パプ。 smarden.org。
7
JdeBP

これは、Ubuntu/Debian( manpageを参照 )で利用可能なudpsvdを使用して行うことも、busyboxに組み込みで行うこともできます。例:

# simple UDP "echo" on port 9998
udpsvd 0.0.0.0 9998 cat

catを実行するシェルスクリプトに置き換えます。stdinはパケットです。

netcatを使用すると、ループで実行してリスニングを継続し、各パケットをmyscriptに渡すことができます。

 while true; do nc -ul 9998 | myscript.sh; done

受信したすべてのパケットをストリームとしてスクリプトの1回の呼び出しに渡したい場合:

# this will keep listening instead of terminating the process:
nc -kul 9998 |myscript.sh
0
thom_nic