从终端访问数据

Access data from terminal

本文关键字:数据 访问 终端      更新时间:2023-10-16

我必须写一个程序,从终端拦截数据,我必须解析它。当数据处理后,我必须在它进入stdout之前对其进行解析。

我不能使用teeprog > file 2>&1之类的命令,因为程序将是交互式的。

例如:如果用户在终端中输入ls,我必须解析它,然后它应该进入操作系统,然后当我得到处理后的结果时,我必须在它显示在终端之前再次解析它。

我做了我的研究,我认为我可以通过伪终端接口(pty)来实现。

请让我知道是否有更好的方法来实现它。我使用cppbash,平台是*nix

更新:我也可以从expect使用libexpect

我不知道你在这里是什么意思-你的意思是交互式程序"在另一个终端与用户通信",甚至显示GUI?

它如何指定终端?这里的程序布局(哪个程序启动哪个程序)可能很重要。

如果你的应用程序使用GUI与用户通信,那么我会简单地这样做:启动bash时,将sdtin和stdout连接到管道,你的程序读取&写入到这些管道的末端,解析数据,并在它自己的标准输出上读写-因此它出现在它的终端上。

如果你的意思是控制不同的终端,而不是你的应用程序的终端,因为系统通常不希望程序在多个终端上运行。我不认为这是可能的过滤终端之间的通信和已经工作的应用程序附加到它。启动另一个进程生成另一个终端可能是一种选择-基本上有两个终端同步工作。但是你必须通过其他方式(命名管道,网络连接或其他IPC)同步两个进程。

如果你提供更多关于你的程序的细节,我可能会提供更多直接的帮助。

别告诉我你在写什么终端键盘记录器')

编辑:

你的程序可能是基于GUI的-我建议的是类似于banuj链接的答案。

最好的选择可能是创建三个管道,然后fork,并在子进程中将管道的相应末端分配给stdin, stdout和stderr。然后子进程应该执行到shell -可能是bash,虽然我不确定如果大声读出其他shell是否会听起来更好;)主进程将能够读写上述管道的其他端,解析bash和它运行的程序的输入和输出。您也可以直接执行用户指定的命令,但这迫使您接管shell的繁琐工作-管理当前目录,环境变量,作业控制等。

使用上述方法可能会引起一些麻烦-某些程序(通常在安全相关的上下文中),例如。无论如何,Su (do)请求密码将尝试绕过stdin/stdout,直接从终端设备读取。我不知道在这种情况下你能做什么——编程你自己的终端模拟器将是一个选择,但我不知道你是否想要深入到这个系统编程。

如果你想要一些代码片段,如果你不知道怎么做,就问;)