0

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

用例:用户 ssh 进入我的机器并运行交互式工具。通过审计,我可以看到正在运行的命令,但我还需要查看输出。我可以听,/dev/pts/<n>但原来登录的用户没有得到输出。

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

4

1 回答 1

1

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

您可以从stracewhich is 本身开始使用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.

然后,您可以查看strace正在执行的操作 - 例如,通过 strace 本身

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

并通过研究其源代码。

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

于 2020-09-24T00:57:39.083 回答