socat 等人:收到传入连接时运行命令

socat 等人:收到传入连接时运行命令

假设有人正在使用 socat 监听 tcp 端口上的传入连接,如下所示:

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

收到连接时是否可以运行命令(仅一次)?它可以是任何命令,尽管我打算运行notify-send以获取通知。

答案1

使用execsystem来运行命令,而不是file

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

这里运行date命令并在每次连接时将其输出发送到客户端,使用U从第二个地址到第一个地址的双向流(或 IOW, 的输出date发送到套接字,但来自套接字的数据不会发送到date) 。

或者运行notify-send并向客户端发送消息,使用system获取 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

错误(shnotify-send如果echo有的话)将发送到socat的 stderr,而不是发送到客户端,尽管可以通过传递选项来更改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

相关内容