问题描述
我想编写一个程序,该程序可以捕获伪终端的输入/输出而不会影响原始终端。可以比喻为将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
-可以基于每个用户或连接的主机进行修改)。