Linux:捕获已运行进程的输出(使用纯C!)

4
我的情况如下:我有很多小设备(非常接近路由器,但不完全如此),它们运行着一个简单的基于MIPS的Linux发行版。要控制它们,可以通过串口telnet进入,并向交互式类似bash的shell发出命令,然后输出一些内容。该shell的输入和输出都连接到/dev/ttyAS0。
现在,我想自动化所有这些,即编写一个程序,在gizmo内部运行,成为监听某个端口的小型服务器,将任何命令传递给该shell,捕获shell的输出并将其传递回与服务器联系的任何人。
我:
1)可以在gizmo内安装(小于500KB)程序 2)不能修改操作系统、启动脚本、shell或其他任何东西 3)具有root访问权限 4)知道如何编写SOAP服务器 5)知道如何获取SOAP消息,将其转换为命令并注入/dev/ttyAS0 6)不知道如何捕获shell的答复 7)知道如何将shell的答复转换回SOAP消息并回复原始查询者。
基本上,问题是6):如何在将字符串注入/dev/ttyAS0并使shell执行它后,捕获shell的输出?
我知道

http://etbe.coker.com.au/2008/02/27/redirecting-output-from-a-running-process/

即,我知道如果在盒子内部运行GDB(或strace),则可以更改shell的stdout,但我无法在那里安装它-它太大了,而且这种方法似乎太像黑客攻击。

因此,总结一下:

如何使用纯C捕获已经运行进程的stdout,没有gdb或strace,并且无法访问进程启动方式?

或者-几乎等效地-如何使用纯C捕获写入终端的内容?

2个回答

2
你可能想看一下reptyr。它与你的系统可能需要一些调整才能正常工作。 链接

1
谢谢,伙计!实际上reptyr只支持i386架构,但它使用ptrace的方式启发了我很多!问题解决了,我现在有了最终的程序 :) - Leszek

0

你尝试过使用kermit脚本驱动串口吗?我可能会放弃在设备上插入更聪明的代理,而是尝试驱动现有的接口。

如果你真的想把它放在设备上,你可以查看类似screenkermit的源代码,以了解它们如何与ttys交互。


事实上,Kermit是我解决这个问题的首选方案,我已经尝试过并且它有效。然而,整个练习都是为了工作(我们正在将一堆标准、低成本的小玩意儿组合起来,使它们以未设计的方式相互配合)。要求是该盒子由SOAP控制。就像我在上面说的那样,我能够交叉编译一个小型SOAP服务器,并让它控制shell,问题是如何读取shell的输出。也许我可以直接从/dev/ttyAS0读取?(没有其他任何东西会输出到那里)。但是如何从原始终端读取呢? - Leszek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接