回应“写”消息

时间:2011-05-30 16:24:25

标签: bash

想知道是否有人知道如何捕获并识别到终端的传入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

1 个答案:

答案 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输出中。