Как изменить входной поток netcat? - PullRequest
0 голосов
/ 27 января 2012

Я создаю интерфейс TCP / IP к последовательному устройству на RedHat Linux-машине. Netcat в bash-скрипте использовался для достижения этой цели без особых проблем.

nc -l $PORT < $TTYDEVICE > $TTYDEVICE

Проблема в том, что последовательное устройство использует возврат каретки ('\ r') для конца строки в своих ответах. Я хочу перевести это в ("\ r \ n"), чтобы машины Windows, использующие telneting, могли просматривать ответ без каких-либо проблем. Я пытаюсь понять, как это сделать с помощью простого решения bash. У меня также есть доступ к stty для настройки последовательного устройства, но на стороне ввода нет перевода «\ r» в «\ r \ n» (насколько я могу судить).

Я попытался использовать tr на входной стороне netcat, но это не сработало.

#cat $TTYDEVICE | tr '\r' '\r\n' | nc -l $PORT > $TTYDEVICE

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Ваша проблема в том, что клиент, который подключается к $ PORT, вероятно, не имеет ни малейшего представления о том, что он работает с tty с другой стороны, поэтому у вас возникнут проблемы с tty-специфическими "функциями", такими как ^ C /^ D / и т.д..и CRLF.

Вот почему

socat tcp-listen:1234 - | hexdump -C
telnet localhost 1234
[enter text]

будет показывать CRLF, а

ssh -t localhost "hexdump -C"
[enter text]

- чистые LF.Впоследствии вам, например, понадобится

ssh -t whateverhost "screen $TTYDEVICE"

tl; dr: netcat этого не сделает.

1 голос
/ 27 января 2012

Это слишком сложно со стандартными инструментами, но довольно легко в perl (хотя в наши дни perl является довольно стандартным инструментом):

perl -pe 's/\r/\r\n/g'

Приведенная выше версия, скорее всего, прочитает весь ввод в память перед выполнением какой-либо обработки (будет считываться до тех пор, пока не найдет «\ n», который будет представлять собой весь ввод, если вход не содержит «\ n»), поэтому может предпочесть:

perl -015 -pe '$\="\n"'
1 голос
/ 27 января 2012

Существует несколько версий netcat (GNU и BSD), но вы можете попробовать:

 -C      Send CRLF as line-ending
...