想知道是否有人知道如何捕获并识别到终端的传入write
命令。我尝试使用script -f
,然后使用tail -f
跟踪while循环的输出,但因为我跟踪的终端没有启动write
,所以它不会输出。不幸的是我没有root权限,不能玩pts或screendump,想知道是否有人知道实现这个的方法?
示例:
Terminal 1 $ echo hello | write Terminal 2
Terminal 2 $
Message from Terminal 1 on pts/0 at 23:48 ...
hello
EOF
*Cause a trigger from which I can send a return message
答案 0 :(得分:3)
我想不出任何明显的方法来做到这一点。这就是为什么......
你的shell从某个终端接收输入,并将其输出发送到某个终端 设备:
+-----------+
| |
| bash |
| |
+-----------+
^ |
| |
| v
+----------------------+
| some terminal device |
+----------------------+
当write
写入终端时,它会将数据直接发送到同一终端设备。它不会靠近你的shell:
+-----------+ +-----------+
| | | |
| bash | | write |
| | | |
+-----------+ +-----------+
^ | |
| | |
| v v
+----------------------+
| some terminal device |
+----------------------+
因此,为了能够捕获write
发送的内容,您需要终端设备本身提供的一些挂钩,我认为您无法使用任何内容这样做。
那么script
如何工作,为什么不捕获write
输出?
script
也无法挂接到终端设备。它真的想在你的shell和你的终端之间插入它自己,但没有一个好的方法直接这样做。
因此,它创建了一个 new 终端设备(一个伪终端,也称为“pty”)并在其中运行一个新的shell。一个pty由两个方面组成:“master”,它只是一个字节流,和一个“slave”,看起来就像任何其他交互式终端设备。
新shell附加到从属端,script
控制主端 - 这意味着它可以将字节流保存到文件中,并在新shell和原始shell之间转发它们终端:
+-----------+
| |
| bash |
| |
+-----------+
^ |
| |
| v
+-----------------+ <=== slave side of pty -- presents the interface of
| pseudo-terminal | an interactive terminal
+-----------------+ <=== master side of pty -- just a stream of bytes
^ |
| v
+-----------+
| |
| script |
| |
+-----------+
^ |
| |
| v
+----------------------+
| some terminal device |
+----------------------+
现在您可以看到原始终端设备的write
绕过了所有内容,就像上面简单的情况一样:
+-----------+
| |
| bash |
| |
+-----------+
^ |
| |
| v
+-----------------+ <=== slave side of pty -- presents the interface of
| pseudo-terminal | an interactive terminal
+-----------------+ <=== master side of pty -- just a stream of bytes
^ |
| v
+-----------+ +-----------+
| | | |
| script | | write |
| | | |
+-----------+ +-----------+
^ | |
| | |
| v v
+----------------------+
| some terminal device |
+----------------------+
如果您在此处将数据写入 new 终端的从属端,您将看到输出显示,因为它将出现在数据流中主人,script
看到的。您可以在tty
内的shell中使用script
命令找到新pty的名称。
不幸的是,这对write
无效,因为您可能无法write
:您的登录会话与原始终端相关联,而不是新终端,并且write
可能会抱怨你没有登录。但是如果你这样echo hello >/dev/pts/NNN
,您会看到它确实显示在script
输出中。