シェルスクリプトを特定のポートでリッスンする方法を知りたいです(おそらくnetcatを使用していますか?)。うまくいけば、メッセージがそのポートに送信されると、スクリプトがメッセージを記録してから関数を実行します。
例:
コンピューター1のスクリプトはバックグラウンドで実行されており、スクリプトは着信トラフィックに対してポート1234を開きました
コンピューター2はメッセージ「hello world」をコンピューター1のポート1234に送信します
コンピューター1のスクリプトは、メッセージ "hello world"を変数$ MESSAGEに記録します
変数$ MESSAGEが設定されたため、スクリプトは関数を実行します
これを寄付するにはどうすればよいですか?
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
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ファミリのサービスマネージャの下で実行する方法です。もちろん、直接呼び出すこともできます。
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
Laurent Bercotのs6-networkingを使用すると、s6-tcpserver4
とs6-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ツールセットを使用すると、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-check
やsetuidgid
などのツールをチェーンに挿入することで、より複雑なサーバーを構築できます。
#!/ bin/nosh tcp-socket-listen --combine4and6 :: 7777 setuidgid unprivileged-user tcp-socket-accept --verbose --localname 0 ucspi-socket-rules-check --verbose ./ service
Gerrit Papeのipsvdを使用すると、tcpsvd
はservice
スクリプトを生成します。
#!/ bin/sh -e exec tcpsvd -v 0.0.0.0 7777 ./service
共通のservice
スクリプトは、標準入力がstreamソケットの場合に処理できます。しかし、TCP=を明示的に指定していません。
前述のツールキットの一部を使用して、UDPサーバーをビルドする方法と同様の方法でUDPサーバーをビルドすることができますが、TCPサーバーを参照してください(noshのudp-socket-listen
を参照))、ビルドは難しいです標準入力がdatagramソケットである場合、シェルのビルトインは必ずしも適切に対応しないため、シェルスクリプトを含む実際のサービスプログラム。
tcpserver
プログラム。 ucspi-tcp。tcpserver
。 ucspi-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。tcpserver
。 noshガイド。ソフトウェア。tcp-socket-listen
。 noshガイド。ソフトウェア。tcp-socket-accept
。 noshガイド。ソフトウェア。ucspi-socket-rules-check
。 noshガイド。ソフトウェア。setuidgid
。 noshガイド。ソフトウェア。udp-socket-listen
。 noshガイド。ソフトウェア。tcpsvd
。 ipsvd。ジェリット・パプ。 smarden.org。これは、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