在 Gentoo Linux 机器上,一个进程通过串行端口 ( /dev/ttyS1
)与另一台计算机通信。我想在不进一步干扰的情况下收听此通信(即进程发送/接收的内容)。
如何仅使用基本的 Linux 工具来实现这一目标?我什至可以更改进程正在与之通信的串行端口,所以也许我可以“快捷地”两个设备(/dev/ttyS1
和/dev/xxx
)侦听所有通信,当所有输出/dev/ttyS1
都转发到时/dev/xxx
,反之亦然。但是我该怎么做呢?有什么socat
?
X T*_*ian 10
拦截看起来像你想要的。
我发现从这个Ubuntu 页面
拦截 - 拦截进出串行端口的流量。
例子
如果您想将拦截用作外部串行监视器[连接到您机器上的两个串行端口并在它们之间进行中继,同时记录输出]
您可以使用一台设备作为后端,并使用 -p 选项告诉前端不要创建它自己的 tty,而只需使用您告诉它的那个:
interceptty -s 'ispeed 19200 ospeed 19200' /dev/ttyS0 -p /dev/ttyS1 -
Run Code Online (Sandbox Code Playgroud)
输出
拦截以一种相当不吸引人的、令人痛苦的格式打印其输出。但是,其他程序很容易解析。有关如何将此输出后处理为适合您拦截的任何内容的示例,请参阅包含的 Perl 脚本interceptty-nicedump。
输出行采用以下通用格式:
< 0x54 (T)
Run Code Online (Sandbox Code Playgroud)0x4b (K) ^ Direction ^^^^ Hex code (to real device) ^^^ ASCII character (to real device) ^^^^ Hex code (from real device) ^^^ ASCII character (from real device) The direction marker is a '<' if this character was sent to the backend device, and
'>' 如果它是从后端设备收到的。它后面总是跟一个空格。如果字符是从真实设备接收的,接下来会出现一个选项卡(这使得输出更容易理解)。之后是字符的十六进制代码,如果是 ASCII 字符,则是字符的 ASCII 表示。
一种方法(不一定是最好的...)是附加strace
到进程(或者,为了处理竞争条件,附加到该exec
进程的包装脚本),设置strace
最大字符串长度,然后捕获所有read()
s和write()
s (或您的流程使用的任何内容)。之后,您使用正确的文件描述符(应该始终相同;如果不是,那么您open()
也必须捕获 s)来 grep 行。