linux 如何监视进程和终端之间的通信?

ktca8awb  于 2023-11-17  发布在  Linux
关注(0)|答案(8)|浏览(113)

我有一个由第三方开发的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/ttystdout
这种方法可以工作,但感觉很不可靠,而且依赖于替换设备的技巧。它也不能在两个方向上工作,因为命名管道只在一个方向上传输数据。
怎么做才对?
如果有人想知道,TTY设备是一个RS-232链接到一个微控制器。信息是不敏感或安全的。所有进程(应用程序和间谍)可以运行作为根。

yqkkidmi

yqkkidmi1#

你考虑过使用strace/ltrace吗?你可以看到它正在进行的系统调用,特别是你可以看到正在进行的write/ioctl等调用。

iswrvxsc

iswrvxsc2#

RS-232?只需用夹子轻敲RxD/TxD/GND线。这是一个永远,因为我已经看到任何设备甚至关心DCD,DTR等。

voase2hg

voase2hg3#

你可以看看slsnif,它完全可以满足你的需求,或者如果你有兴趣自己写一个的话,可以从源代码中了解它是如何工作的。

qaxu7uf2

qaxu7uf24#

有一些替代方案:
用GDB自己做:Redirecting Output from a Running Process
CryoPID允许您捕获Linux中正在运行的进程的状态,并将其保存到一个文件中。该文件随后可用于在重新引导后或甚至在另一台机器上恢复该进程。
Distributed MultiThreaded CheckPointing是一个工具,用于透明地检查分布在许多机器上并通过套接字连接的任意程序组的状态。

pkln4tw6

pkln4tw65#

script程序使用psudo-terminal来实现这一点。设备/dev/tty通常是特殊的,它引用当前进程的控制终端,所以你可能不必求助于重命名。
script打开一个psudo终端,然后运行另一个shell示例,并将新的shell作为其控制终端(因此/dev/tty引用此shell及其子进程的psudo终端)。-c选项允许您运行特定的命令,而不是shell。
script的主要问题是,无法判断输出文件(默认情况下为./typescript)中捕获的数据是以何种方式传输的--双向传输的数据被转储到同一个文件中,并且看起来与使用交互式终端时屏幕上显示的内容相似(除了包括转义、回车和类似的愚蠢内容以及正常显示的字符)。
无论如何,我知道这个问题早就有了答案,但我想,如果有人要寻找类似的解决方案,而不是使用真实的串行端口,这可能会帮助他们。

kgsdhlau

kgsdhlau6#

并不简单(至少对我来说不简单),但一个应该适用于tty串行驱动程序的机制是line discipline

gxwragnw

gxwragnw7#

这里的人已经提出了很好的建议,但这里有另一个:
您也可以使用自己的write()编写一个共享库,在从libc.so调用write()之前执行一些工作。然后您可以在进程启动时使用LD_PRELOAD环境变量加载您的库。

vybvopom

vybvopom8#

使用socat:

# socat -v -v /dev/real_tty exec:"./third-party-app",pty,ctty,setsid,echo=0

字符串
-v选项应该显示TTY之间的通信。
这里有一个很好的示例参考:

相关问题