首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Ttyutils 截获 UNIX/Linux 终端 (3)

使用 Ttyutils 截获 UNIX/Linux 终端 (3)

Ttyutils 内部原理描述  前面描述了如何使用 ttyutils 软件包中的程序来监控终端的会话,读者可能好奇它的内部是如何工作的,这一部分将描述这些内容。
实现 ttyexecttyexec 是一个监控程序,它通过建立一个伪终端来运行一个应用程序,从而达到监控那个应用程序的目的。所以,要理解 ttyexec 的实现,必须理解伪终端。
伪终端
伪终端这个名词暗示它是一个虚拟的终端,应用程序可以将其作为一个终端设别使用,但是它不是一个真实的终端,一个伪终端由两端构成,分别称为伪终端主设备和从设备,任何写到伪终端主设备的输入都会作为从设备端的输入,反之亦然。事实上所有从设备端的输入都来自于主设备上的用户进程。这看起来就像一个流管道,但从设备上的终端行规程使我们拥有普通管道之外的其他处理能力。
文件 /dev/ptmx 是一个字符设备,它用来建立伪终端主从设备。
截获进程输入输出
ttyexec 通过建立一个伪终端,然后调用 fork。子进程建立了一个新的对话,打开一个相应的伪终端从设备,将它复制成标准输入、标准输出和标准出错,然后调用 exec。伪终端从设备成为子进程的控制终端。
对于伪终端从设备之上的用户进程来说,其标准输入、标准输出和标准出错都能当作终端设备使用。用户进程能够调用所有输入 / 输出函数。
虚拟终端
当 ttyexec 从伪终端主设备接收到数据后,这些数据是原始的 Escape 序列,它还需要传递给内置的 Escape 解析器,最后在内存中构造一个和屏幕上相同的虚拟终端。
注意虚拟终端,伪终端和实际终端之间的区别,下面的图描述了它们之间的关系:
图 2 ttyexec 内部关系 当使用 ttyexec 执行其它命令时, ttyexec 实际上拥有了两个终端设备,一个是继承于 shell 的实终端 ( 也可能是伪终端,例如在终端仿真程序中运行 ttyexec),另外一个是 ttyexec 建立的伪终端,后者将被 ttyexec 执行的命令使用。
当在使用 ttyadmin 时,得到的输出中有一栏名为 TTY,还有一栏名为 PTS,分别指的就是上面的实终端和伪终端。
ttyexec 拥有两个终端设备,其中伪终端被用于执行的命令,因为伪终端的一端的输出将会是另一端的输入,也就是说,被 ttyexec 执行的命令的所有输出将是 ttyexec 的输入,所以, ttyexec 截获了被执行的命令的全部终端输出。
同样,因为用户从真实终端的数据要通过 ttyexec 转发到伪终端上执行的命令,所以 ttyexec 也截获了用户的所有输入,并且可以模拟用户的输入发送数据到伪终端,这可以用于自动填充数据这样的场合。
通过虚拟终端在内存中重构一个终端屏幕,可以实时的跟踪屏幕的变化,并且根据当前屏幕的特征来触发事件,完成特定的事情。
伪终端是双向通讯设备,所以 ttyexec 可以输入数据到伪终端来模拟设备的标准输入 ( 键盘输入 ),ttyexec 提供的 feed RPC 服务就利用了这个特征。
需要澄清的一点是,虽然 ttyexec 能够控制被执行命令在终端上的的输入和输出,但不能改变被执行命令的内部程序逻辑。
支持 ttylook
Ttyexec 通过内置了一个网络服务器来支持 ttylook,这个服务在 ttyexec 中称为 lookd,它利用 UNIX socket 等待和 ttylook 建立一个双向的通讯,将截获的数据发送给 ttylook 即可,这项服务不能跨网络使用。
因为是双向通讯,所以 ttylook 也可以发送数据给 ttyexec 来写入伪终端主设备作为被 ttyexec 执行的程序的标准输入。
支持 RPC 服务
ttyexec 通过内置的一个网络服务器来支持 RPC 服务,这个服务在 ttyexec 中称为 RPCD,它利用 UNIX socket 等待和应用程序建立一个双向的通讯,然后根据应用程序的请求,返回相应的响应,这项服务不能跨网络使用。
因为 RPC 请求和响应的格式是由 ttyexec 内部定义的,为了方便开发人员使用,Ttyutils 提供了一个库,对这些细节进行了封装,所以在应用程序中使用 RPC 服务是非常简单的事情。
支持事件触发
事件触发的根本在于前面提到的虚拟终端,在 ttyexec 中,维护了一个事件表,每当虚拟终端发生变化时,它将会去用当前虚拟终端屏幕的内容去逐项匹配事件表中的事件,如果能够匹配,那么将触发一个动作。
因为终端的变化非常的频繁,如果事件表中有大量的事件,那么速度会受到一定的影响,但是为了确保实时性,这样的匹配是需要的,具体事件表能够加载多少事件没有限制,这个由管理人员根据系统的处理能力而定。
实现 ttylookTtylook 是 ttyexec lookd 服务器的客户端,它实现了两项功能:
1.从 ttyexec 接收数据,然后写到 用户终端
2.从 用户终端 接收数据,然后发送到 ttyexec。
这里 用户终端 是指运行 ttylook 的终端。
接收 ttyexec 的数据
ttylook 在启动时,将通过 UNIX socket 和 ttyexec 建立连接。
ttyexec 接收了这个连接之后,它会将所有被监控程序的标准输出数据 ( 输出到终端屏幕上的数据 ) 传送给 ttylook,然后 ttylook 简单的将这些数据写到用户的终端屏幕。
注意 ttylook 不理睬在 socket 之间传送的数据内容,这些数据直接被写到用户终端屏幕,所以如果运行 ttyexec 和 ttylook 的终端类型不同,那么可能会出现屏幕的内容错乱。
发送数据给 ttyexec
ttylook 在启动时,会将用户终端的标准输入 ( 键盘 ) 至于关闭回显模式,这样,用户在终端上的输入在屏幕上是不可见的。
但是 ttylook 会得到这些输入数据,然后将这些数据传送给 ttyexec,ttyexec 会将这些数据作为用户的输入写到被监控的进程,这就好像运行 ttyexec 的用户输入了数据一样。
实现 ttyadmin 当 ttyexec 启动的时候,它会将它自身的信息注册到一个系统区域,称为黄页,这个黄页是用一片共享内存实现的,ttyexec 注册的信息包括它的进程 ID,终端和伪终端名称,lookd 服务和 rpcd 服务帮定的地址,等等,每个 ttyexec 在黄叶中占据一项。
当 ttyexec 退出的时候,它会将自身的注册信息从黄页中删除。
Ttyadmin 主要是管理这个黄页的程序。
查看 ttyexec 实例
在 ttyadmin 启动时,它建立一个全屏幕的窗口,然后查询黄页,得到当前系统中所有 ttyexec 实例的注册信息,并将这些数据缓存到自己的内部表中。
然后它格式化得到的信息,显示在主窗口中。
后续的所有操作 ( 例如排序 ) 都是基于这个内部表,但是允许用户去重读黄页 ( 当前的实现是按下空格键或者设定一个更新超时 )。
管理 ttyexec 实例
ttyadmin 提供了对 ttyexec 的管理能力,这些能力可以在运行 ttyadmin 时通过帮助获得,这里要说明的是,这些管理功能主要是基于黄页中的信息。
虽然 ttyadmin 可以查看和管理 ttyexec,但是它和 ttyexec 没有直接的关系。
ttyexec 也为 ttyadmin 提供了一些管理功能 ( 例如查询事件表的内容 ),这是通过 ttyexec 的 RPC 服务实现的,在这种情况下,ttyadmin 只能算是 ttyexec 的一个 RPC 客户端。
返回列表