誰かがsocatを使用して、次のようにtcpポートから着信接続をリッスンしているとします。
$ socat file:`tty`,echo=1 "TCP-L:8080"
接続を受信したら、コマンドを一度だけ実行できますか?notify-send
通知を受け取るために実行しようとしていますが、どのコマンドでも可能です。
答え1
代わりにコマンドを実行するには、exec
またはを使用します。system
file
socat -U tcp-listen:8000,reuseaddr,fork exec:date
これはdate
コマンドを実行し、2番目のアドレスから最初のアドレス(またはIOW)への双方向ストリームを使用して各接続のクライアントに出力を送信します。U
その出力はdate
ソケットに転送されますが、ソケットのデータは送信されません。転送date
)。
または、notify-send
クライアントにメッセージを実行して送信するには、system
get 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を使用できます