窥探伪终端

问题描述

我想编写一个程序,该程序可以捕获伪终端的输入/输出而不会影响原始终端。可以比喻为将script指向/dev/pts/<n>

用例:一个用户ssh进入我的计算机并运行一个交互式工具。通过审核,我可以看到正在运行的命令,但是我还需要查看输出。我可以在/dev/pts/<n>上收听,但是原始登录用户无法获得输出

我想编写自己的程序来处理这种情况。这个问题实际上可以解决吗?如果可以,我应该在哪里寻找解决方案?

解决方法

在ssh服务器进程上使用ptrace(2)可解决该问题,该进程处理伪终端的主端(通常是终端中运行的Shell的父进程)。

您可以使用strace开头的ptrace(2)开头,例如

strace -p <pid> -e trace=read,write \
  -e read=<fds opened to /dev/ptmx> \
  -e write=<fds opened to /dev/ptmx>

这将向您显示已对该伪终端进行读取或写入的所有内容。您可以从ls -l /proc/<pid>/fd获取“向/ dev / ptmx打开的fds”。

然后您可以查看strace在做什么-例如,通过使用跟踪strace本身

strace -e trace=ptrace,process_vm_readv strace ...

并研究其源代码。

您当然可以修改ssh服务器本身以记录所有这些信息,或者只是调整其配置选项(例如LogLevel -可以基于每个用户或连接的主机进行修改)。