socat et al:着信接続を受信したらコマンドを実行します。

socat et al:着信接続を受信したらコマンドを実行します。

誰かがsocatを使用して、次のようにtcpポートから着信接続をリッスンしているとします。

$ socat file:`tty`,echo=1 "TCP-L:8080"

接続を受信したら、コマンドを一度だけ実行できますか?notify-send通知を受け取るために実行しようとしていますが、どのコマンドでも可能です。

答え1

代わりにコマンドを実行するには、execまたはを使用します。systemfile

socat -U tcp-listen:8000,reuseaddr,fork exec:date

これはdateコマンドを実行し、2番目のアドレスから最初のアドレス(またはIOW)への双方向ストリームを使用して各接続のクライアントに出力を送信します。Uその出力はdateソケットに転送されますが、ソケットのデータは送信されません。転送date)。

または、notify-sendクライアントにメッセージを実行して送信するには、systemget shellを使用します。

socat -U tcp-listen:8000,reuseaddr,fork 'system:{
  if
    notify-send "Got connection from $SOCAT_PEERADDR:$SOCAT_PEERPORT"
  then
    # sending to the client
    echo OK: notification sent successfully
  else
    echo ERROR: could not send notification
  fi
}'

同じ文字やその中にある文字を処理できないようにすることで、一種の引用符{...}として解釈されますが、単にコマンドグループとして扱われるところから渡される場合もあります。socat,"sh

エラー(shまたはエラーがあるnotify-send場合echo)はクライアントではなくstderrに送信されますが、socatオプションを渡すことで変更できますstderr

socat -U tcp-listen:8000,reuseaddr,fork 'system:{
  if
    notify-send "Got connection from $SOCAT_PEERADDR:$SOCAT_PEERPORT"
  then
    # sending to the client
    echo OK: notification sent successfully
  else
    echo ERROR: could not send notification
  fi
},stderr'

答え2

私はsocatに慣れていませんが、ncは慣れていません...

while true; do $CMD | nc -l 8080; done

(標準出力がクライアントに返されます.)

OTOH、xinetd、またはsystemd-socket-activateを使用できます

関連情報