【问题标题】:socat: log conversation with serial portsocat:用串口记录对话
【发布时间】:2014-12-07 01:51:56
【问题描述】:

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

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

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

编辑:

我想出了一个办法,(但我认为这是一个杂项),所以我回答了我自己的问题 - 按照堆栈溢出标准,这是一个有效的答案。

【问题讨论】:

  • man socat 应该会给你方法,这里是dest-unreach.org/socat/doc/socat.html
  • 好吧,我阅读了thisthis,以及手册页。文档给了我一些尝试的想法,但它们都不起作用:socat -v log.txt ... 有一个标题和不必要的\r,而任何尝试将socat 的第一个实例(将串行绑定到控制台的那个)传递到另一个(将控制台绑定到文件)要么产生错误(地址太多/太少),要么产生一个空文件。
  • 请发布socat -v log.txt 的输出以及需要对文件进行哪些更改才能满足您的需求。我相信awk 会成功的。

标签: bash tty socat


【解决方案1】:

(我的第一种方法不正确,所以我修改)

我从未使用过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) ...

我希望这会有所帮助!

【讨论】:

  • 我不熟悉创建这样的流程的概念。由于该系统上没有awk,我将使用tr 和/或sed。但仅出于测试目的,我无法在没有任何翻译的情况下重现您的命令,即socat -v ... 2&gt;(cat &gt;log.txt)
  • @Ulrik:抱歉,我误解了-v 的含义。我认为它需要一个文件 arg 并打印到该文件,但不是。它还将输出重定向到stderr。我更正了我的答案。
  • 值得注意的是,您可以使用-x 选项让socat 以十六进制格式显示数据,而不是-v 提供的更“可读”的格式
猜你喜欢
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
相关资源
最近更新 更多