Claro que é possível. Basta configurar nc
como co-processo:
#!/bin/bash -x
# Greets the client with their hostname.
coproc ( nc -l -v localhost 3000 2>&1 )
{
declare "$( sed -e 's/^Connection from \([^ ]*\).*$/client=""/' -e 'q' )"
printf 'Hello there, user on %s\n' "$client"
} <&${COPROC[0]} >&${COPROC[1]}
kill "$COPROC_PID"
Para algo mais avançado, como lidar com solicitações HTTP:
#!/bin/bash
# Handles one request, then kills nc and restarts
while true; do
coproc ( nc -l localhost 3000 2>&1 )
{
get_http_request_header
process_request
send_http_reply
} <&${COPROC[0]} >&${COPROC[1]}
kill "$COPROC_PID"
done
Os comandos get_http_request_header
,
process_request
e
send_http_reply
pode ser funções do shell ou scripts separados que você escreve.
A rotina get_http_request_header
obteria sua entrada padrão do cliente conectado a nc
e analisaria a solicitação, possivelmente armazenando-a em um arquivo temporário ou configurando algumas variáveis globais ou, de alguma outra forma, transmitindo as informações necessárias para process_request
.
process_request
pode manipular a compilação do resultado da maneira que for necessária.
send_http_reply
imprimiria no cliente simplesmente gravando na saída padrão.
Outra configuração possível em que as informações no lado do servidor são simplesmente passadas pelas etapas internas por meio de pipes:
#!/bin/bash
# Handles one request, then kills nc and restarts
while true; do
coproc ( nc -l localhost 3000 2>&1 )
{
get_http_request_header |
process_request |
send_http_reply
} <&${COPROC[0]} >&${COPROC[1]}
kill "$COPROC_PID"
done