如果要查看其上显示的内容,则是要监视的终端仿真器中伪终端主端的fd。那主 fd是模拟连接到真实终端的电线的工具。什么xterm
写在它是从你按下键生成的字符。它从中读取的是显示的内容。
例如,在Linux上:
$ lsof -ac xterm /dev/ptmx
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xterm 15173 chazelas 4u CHR 5,2 0t0 2131 /dev/ptmx
然后例如运行:
stty -echo -opost
strace -e read -e read=4 -p15173 2>&1 | stdbuf -o0 sh -c '
grep "^ |" | cut -b11-60 | tr -d " " | xxd -r -p'
当然,如果您在与要监视的终端相同类型和大小的终端中运行该终端,效果会更好。您可以通过以下方式获得尺寸:
stty size < /dev/pts/that-terminal
那倾倒了阅读的东西xterm
从终端主端,因此在那里显示的内容,包括echo
所键入内容的本地内容。
在-e read=4
上面的是strace
输出的hexdump都什么xterm
在其FD 4命令的其余部分读取是将其转换成实际的字符。我尝试过,peekfd -n -8 15173 4
但是由于某种原因,只能给出所写的内容。
我们正在-opost
用来禁用监视终端中的任何后处理,以便所有xxd
写入从属端的内容都不会更改到我们的主控端,以便我们的监视xterm
获得与被监视端相同的功能。-echo
如此一来,如果受监视的终端中的应用程序发送了一个转义序列,要求从终端中寻求答案(例如那些请求光标位置或终端类型或窗口标题的应用程序),那么它将进入我们的监视xterm
和我们的xterm
意志以及答复。我们不希望在当地产生回声。
您还可以通过将write
系统调用跟踪到相同的fd来监视正在键入的内容(替换read
为write
上面的内容)。请注意,按时Enter,终端仿真器将发送CR字符,而不是LF。另外,由于我们是在主机侧进行跟踪,因此如果用户键入a<Backspace>b
,即使终端设备处于规范模式,我们也会看到所有3次击键。
至于为什么你的不起作用:
tee /dev/pts/user_pts </dev/pts/user_pts
从终端设备读取是在读取用户输入,对其进行写入就是将其显示给用户。
您正在告诉您tee
从终端设备读取。因此,它读取的内容(用户输入)将不会read
由终端中运行的应用程序(反之亦然,tee
这application
将为终端输入而战)。写入终端设备是为了在此显示,而不是将其作为输入放回那里。当你做
echo test
(将echo
stdout用作终端),这与您键入的内容不同test
。
有一个ioctl
(TIOCSTI
)可以将字符放回输入中,但是即使这样也不能真正起作用,因为您可以在应用程序读回更多内容后再放回它,因此它将改变应用程序读取输入的顺序,无论如何,那意味着您将一遍又一遍地阅读它。
ttysnoop
还是可能peekfd
。