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


12

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

例:

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

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

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

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

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

回答:


12

で可能になるはず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

あなたはそれをテストしましたか?

書き直され、テストされました;)
rudimeier '10

1
私はあなたの解決策に触発され、netcatで動作する方法を見つけました:nc -l 7777 | ./getmsg.sh
Daniel

それを聞いてうれしい。しかしnetcat、1つの接続の後に存在します。socatコマンドラインから「、fork」を削除した場合も同じようになります。
rudimeier 2016年

7

UCSPI-TCPの方法

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

#!/ bin / sh
読み取り中-r MESSAGE
行う
    echo 1>&2 "$ {TCPREMOTEIP}" "$ {TCPREMOTEPORT}" rx "$ {MESSAGE}"
    func
終わった

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

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

バーンスタインucspi-tcp

Daniel J. Bernsteinのucspi-tcpを使用して、スクリプトをtcpserver生成しserviceます。

#!/ 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

ローランBercotのS6-ネットワーキングで、s6-tcpserver4かつs6-tcpserver6個別にIPv4とIPv6を処理し、産卵serviceスクリプトを:

#!/ command / execlineb
s6-tcpserver4 -v 0.0.0.0 7777 
。/サービス
#!/ command / execlineb
s6-tcpserver6 -v :: 0 7777 
。/サービス

一つは、このようなツールを介在させることにより、より複雑なサーバを構築することができます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
。/サービス

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

#!/ bin / nosh
tcp-socket-listen 0.0.0.0 7777
tcp-socket-accept --verbose --localname 0
。/サービス
#!/ bin / nosh
tcp-socket-listen :: 7777
tcp-socket-accept --verbose --localname ::
。/サービス

一つは、このようなツールを介在させることにより、より複雑なサーバを構築することができますucspi-socket-rules-checkし、setuidgidチェーンに。

#!/ bin / nosh
tcp-socket-listen --combine4and6 :: 7777
setuidgid非特権ユーザー
tcp-socket-accept --verbose --localname 0
ucspi-socket-rules-check --verbose
。/サービス

Pape ipsvd

Gerrit Papeのipsvdを使用して、スクリプトをtcpsvd生成しserviceます。

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

UCSPI-UDP

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

前述のツールキットのいくつかを使用して、TCPサーバーを構築する方法と同様の方法でUDPサーバーを構築できます(udp-socket-listennoshを参照)。標準入力がデータグラムソケットである場合は、必ずうまく対処できます。

参考文献

  • プロトコル:
  • ツールセット:
    • ダニエルJ.バーンスタイン。ucspi-tcp。cr.yp.to。
    • s6-networking。ローラン・ベルコット。skarnet.org。
    • s6。ローラン・ベルコット。skarnet.org。
    • ジョナサン・デ・ボイン・ポラール(2016)。間食 ソフトウェア。
    • ipsvd。ジェリット・パプ。smarden.org。
  • リファレンスマニュアル:
    • ダニエルJ.バーンスタイン。プログラム。ucspi-tcp。tcpserver
    • アーウィン・ホフマン。 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。

0

これはudpsvd、Ubuntu / Debian(マンページを参照)で利用可能なものと、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.