我的情况如下:我有很多小设备(非常接近路由器,但不完全如此),它们运行着一个简单的基于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的输出?
我知道
现在,我想自动化所有这些,即编写一个程序,在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捕获写入终端的内容?