2014-12-07 2 views
3

Через некоторое время, я, наконец, получил socat вести себя таким же образом, как putty, используя:Сокат: войти разговор с последовательным портом

stty -F /dev/ttyS2 115200 cs8 ixoff 
socat $(tty),raw,echo=0,escape=0x03,nonblock /dev/ttyS2 
stty sane 

Я также хотел бы, чтобы войти в разговор в лог-файл.

EDIT:

Я выяснил способ, как это сделать, (но я думаю, что это ляп), так что я ответил на свой вопрос - и это действительный ответ стандартов переполнения стека.

+0

'man socat' должен дать вам способ сделать это, и вот http://www.dest-unreach.org/socat/doc/socat.html – BMW

+0

Ну, я прочитал [это] (https://stuff.mit.edu/afs/sipb/machine/penguin-lust/src/socat-1.7.1.2/EXAMPLES) и [это] (http://technostuff.blogspot.com/2008/10/some-useful- socat-commands.html), а также справочную страницу. Документация дала мне несколько идей, но никто из них не работал: 'socat -v log.txt ...'имеет заголовок и ненужный' \ r', в то время как любая попытка перенести первый экземпляр 'socat' (тот, который привязывает последовательный к консоли) другому (который связывает консоль с файлом) либо вызвал ошибку (слишком много/немного адресов) или пустой файл. – Ulrik

+0

Пожалуйста, опубликуйте вывод 'socat -v log.txt' и какие изменения должны произойти для файла в соответствии с вашими потребностями. Я уверен, что 'awk' будет делать трюк. – ShellFish

ответ

2

(мой первый подход не является правильным, так что я изменить)

Я никогда не использовал socat, но , если он имеет -v log.txt вариант у меня есть возможное решение для Вас, как я вижу, с -v опцией печатает результат также для stderr.

Я предполагаю, что вы хотите, чтобы файл журнала был отправлен в log.txt, вырезали первые 10 строк и удалили все удаленные \r. На , который поддерживает процесс замены это можно сделать так:

socat -v ... 2> >(awk 'NR>10 {gsub("\r","");print}'>log.txt) 

(Имейте в виду пространство между двумя > марок !!!)

Это создаст процесс и >(...) возвращает файл например /dev/fd/68 и перенаправляет stderr. На самом деле это труба для процесса, указанного внутри скобок (awk). Таким образом, текст проходит через , и его вывод записывается в log.txt.

Как Вы упомянули, Вы не это может быть решена с помощью (или tail и tr трубу, но она нуждается в дополнительном процессе).

socat -v ... 2> >(sed -e '1,10 d' -e 's/\r//g' >log.txt) 

(Имейте в виду пространство между двумя > марок !!!)

кажется не поддерживает это, но он работал на довольно старом RedHat Linux.

На самом деле Вы можете также использовать -lf (я не уверен, что это печатает все, что вам нужно Может -v если лучший выбор ....):

-lf <logfile> 
    Writes messages to <logfile> [filename] instead of stderr. 
    Some third party libraries, in particular libwrap, might not obey 
    this option. 

Таким образом, оригинальный подход также может работать:

socat -lf >(sed -e '1,10 d' -e 's/\r//g' >log.txt) ... 

Надеюсь, это поможет!

+0

Я не знаком с концепцией создания таких процессов. Поскольку у меня нет 'awk' в этой системе, я буду использовать' tr' и/или 'sed'. Но только для целей тестирования я не могу воспроизвести вашу команду без какого-либо перевода, т. Е. 'Socat -v ... 2> (cat> log.txt)' – Ulrik

+0

@Ulrik: Извините, но я неверно истолковал значение '-v'. Я думал, что ему нужен файл arg, и он печатается в этот файл, но нет. Он перенаправляет вывод также на 'stderr'. Я исправил свой ответ. – TrueY

Смежные вопросы