我有一个由第三方开发的Linux进程,它与一个终端进行通信。
有人可能会认为cat
可以做到这一点(看到一个方向):
./third-party-app &
cat /dev/tty
字符串
.但它没有。相反,cat
将窃取应用程序的一半数据,这几乎是毫无价值的。
third-party-app被硬编码为假设/dev/tty
。
我发现监视通信的一种方法是将/dev/tty
设备重命名为/dev/real_tty
,并在其位置创建一个名为/dev/tty
的命名管道。然后运行:
cat /dev/real_tty | tee /dev/tty &
型
.至少可以让我看到/dev/real_tty
的输出,方法是将数据从/dev/real_tty
复制到命名管道/dev/tty
和stdout
。
这种方法可以工作,但感觉很不可靠,而且依赖于替换设备的技巧。它也不能在两个方向上工作,因为命名管道只在一个方向上传输数据。
怎么做才对?
如果有人想知道,TTY设备是一个RS-232链接到一个微控制器。信息是不敏感或安全的。所有进程(应用程序和间谍)可以运行作为根。
8条答案
按热度按时间yqkkidmi1#
你考虑过使用strace/ltrace吗?你可以看到它正在进行的系统调用,特别是你可以看到正在进行的write/ioctl等调用。
iswrvxsc2#
RS-232?只需用夹子轻敲RxD/TxD/GND线。这是一个永远,因为我已经看到任何设备甚至关心DCD,DTR等。
voase2hg3#
你可以看看slsnif,它完全可以满足你的需求,或者如果你有兴趣自己写一个的话,可以从源代码中了解它是如何工作的。
qaxu7uf24#
有一些替代方案:
用GDB自己做:Redirecting Output from a Running Process
CryoPID允许您捕获Linux中正在运行的进程的状态,并将其保存到一个文件中。该文件随后可用于在重新引导后或甚至在另一台机器上恢复该进程。
Distributed MultiThreaded CheckPointing是一个工具,用于透明地检查分布在许多机器上并通过套接字连接的任意程序组的状态。
pkln4tw65#
script
程序使用psudo-terminal来实现这一点。设备/dev/tty
通常是特殊的,它引用当前进程的控制终端,所以你可能不必求助于重命名。script
打开一个psudo终端,然后运行另一个shell示例,并将新的shell作为其控制终端(因此/dev/tty
引用此shell及其子进程的psudo终端)。-c选项允许您运行特定的命令,而不是shell。script
的主要问题是,无法判断输出文件(默认情况下为./typescript
)中捕获的数据是以何种方式传输的--双向传输的数据被转储到同一个文件中,并且看起来与使用交互式终端时屏幕上显示的内容相似(除了包括转义、回车和类似的愚蠢内容以及正常显示的字符)。无论如何,我知道这个问题早就有了答案,但我想,如果有人要寻找类似的解决方案,而不是使用真实的串行端口,这可能会帮助他们。
kgsdhlau6#
并不简单(至少对我来说不简单),但一个应该适用于tty串行驱动程序的机制是line discipline。
gxwragnw7#
这里的人已经提出了很好的建议,但这里有另一个:
您也可以使用自己的
write()
编写一个共享库,在从libc.so
调用write()
之前执行一些工作。然后您可以在进程启动时使用LD_PRELOAD
环境变量加载您的库。vybvopom8#
使用socat:
字符串
-v
选项应该显示TTY之间的通信。这里有一个很好的示例参考: