窥探伪终端
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 或连接主机的基础上修改).
我想编写一个程序,可以在不影响原始终端的情况下捕获伪终端的 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
.
然后您可以查看 strace
正在做什么 -- 例如通过使用
strace -e trace=ptrace,process_vm_readv strace ...
并通过研究其源代码。
你当然可以修改 ssh 服务器本身来记录所有信息,或者只是调整它的配置选项(例如 LogLevel
——可以在 per-user 或连接主机的基础上修改).