socat:使用串口记录对话

时间:2014-12-07 01:51:57

标签: bash tty socat

过了一段时间,我终于让socat的行为方式与putty相同,使用:

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

我还想将对话记录到日志文件中。

编辑:

我找到了一种方法,(但我认为这是一个kludge),所以我回答了我自己的问题 - 这是堆栈溢出标准的有效答案。

1 个答案:

答案 0 :(得分: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

如您所述,您没有这可以使用(或tailtr管道来解决,但需要额外的处理。)

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) ...

我希望这有帮助!