窥探伪终端

Snooping on pseudo terminal

我想编写一个程序,可以在不影响原始终端的情况下捕获伪终端的 input/output。它可以比作将 script 指向 /dev/pts/<n>.

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

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

这可以通过在 ssh 服务器进程上使用 ptrace(2) 来解决,该进程处理 pseudo-terminal 的主端(通常是 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>

这将向您显示读取或写入 pseudo-terminal 的所有内容。您可以从 ls -l /proc/<pid>/fd.

获得“fds opened to /dev/ptmx”

然后您可以查看 strace 正在做什么 -- 例如通过使用

跟踪 strace 本身
strace -e trace=ptrace,process_vm_readv strace ...

并通过研究其源代码。

你当然可以修改 ssh 服务器本身来记录所有信息,或者只是调整它的配置选项(例如 LogLevel——可以在 per-user 或连接主机的基础上修改).