假设有人正在使用 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
命令并在每次连接时将其输出发送到客户端,使用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
错误(sh
或notify-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