Como modificar a sequência de entrada do netcat?
-
14-11-2019 - |
Pergunta
Eu estou criando uma interface TCP/IP para um dispositivo serial em um redhat linux máquina.o netcat em um bash script foi utilizado para realizar esta com muita dificuldade.
nc -l $PORT < $TTYDEVICE > $TTYDEVICE
O problema é que o dispositivo serial utiliza retornos de carro(' ') para linha termina em suas respostas.Quero traduzir este (" ") para máquinas com windows telneting podem ver a resposta, sem qualquer problema.Eu estou tentando descobrir como fazer isso com um simples bash solução.Eu também tenho acesso a stty para configurar o dispositivo serial, mas não há " " para " " traduzir no lado de entrada(a partir do que eu posso dizer).
Eu tentei usar o tr no lado de entrada do netcat, mas não funcionou.
#cat $TTYDEVICE | tr '\r' '\r\n' | nc -l $PORT > $TTYDEVICE
Qualquer idéias?
Solução
Isso é muito difícil com as ferramentas padrão, mas é muito mais fácil em perl (embora o perl é praticamente uma ferramenta padrão nos dias de hoje):
perl -pe 's/\r/\r\n/g'
A versão acima provavelmente vai ler toda a entrada para a memória antes de fazer qualquer processamento (ele vai ler até encontrar ' ', que será a entrada inteira; se a entrada não contém ' '), então você pode preferir:
perl -015 -pe '$\="\n"'
Outras dicas
O problema é que o cliente que se conecta a $PORT, provavelmente, não tem a menor idéia de que ele está trabalhando com um tty por outro lado, assim você vai ter problemas com tty específico de "recursos", como ^C/^D/etc.e CRLF.
É por isso que
socat tcp-listen:1234 - | hexdump -C
telnet localhost 1234
[enter text]
vai mostrar CRLFs, enquanto
ssh -t localhost "hexdump -C"
[enter text]
rendimentos puro LFs.Posteriormente, você iria e.g.necessidade
ssh -t whateverhost "screen $TTYDEVICE"
tl;dr:o netcat não fazê-lo.
Há uma série de versões do netcat (GNU e BSD), mas você pode querer tentar:
-C Send CRLF as line-ending