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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top