누군가가 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
명령을 실행하고 두 번째 주소에서 첫 번째 주소(또는 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를 사용할 수 있습니다