在命令行启动后捕获进程的STDIN / STDERR / STDOUT?

谢谢! 我的用户:我开始了一个冗长的交互式“configuration”过程(比如在'屏幕'下面),然后意识到我需要总是回答“否”,直到我看到一个特定的关键字。 似乎浪费时间做手工(不是说我可以轻易地错过关键字..)

因此,似乎我想pipe(复制)STDERR / STDOUT到一个filter,也能够注入到一个(控制台)进程的STDIN,它已经启动后,使用命令行? 有没有现成的解决scheme?

以下工具看起来很有帮助。 要捕获输出,请使用

strace -ewrite -p $PID 

这不是那么干净(显示行如:写(#)),但工程! 但是,它说UTF8处理正确吗?

要redirect输出,请执行类似操作

 printf '..input..' >/dev/pts/33 

但目前还不清楚如何find合适的设备

Solutions Collecting From Web of "在命令行启动后捕获进程的STDIN / STDERR / STDOUT?"

解决在Linux(显然是Linux特有的):

 reptyr -s PID 

将进程附加到另一个终端并且/或者将其输入和输出暴露为管道。

这是可能的,但它不漂亮。 过程如下:

  1. 使用gdb连接到已经运行的进程
  2. 运行p close(<fd>)其中<fd>是要更改的文件描述符
  3. 运行p creat("<path to file">, <perms>)将关闭的fd的输出发送到别的地方

有关更多详细信息,请参阅此链接

你为什么要那样做?

这不可能以便携式Posix -ly的方式! 也许open /proc/1234/fd/0/proc/1234/fd/1/proc/1234/fd/3伪文件(用于进程1234)可能是一个丑陋的可能性! 甚至在某些情况下(例如管道)也可能不起作用。

特别是,我相信,如果没有人正在读取管道, SIGPIPE发送到进程的语义将被破坏…

而且我不相信你能够保持例如标准输出的伪tty质量。

所以基本上,你最好找到一个不同的方式来实现你的总体目标,你没有明确解释。

如果您的用例是一些奇怪的configure脚本,您可以重新启动它,并用自己的一些脚本(shell,python,perl等)来提供它。 不要浪费时间来尝试捕获现有的configure过程,只需重新启动。

还请看screen命令(以及它是如何实现的!)