想知道是否有人知道捕获和识别到终端的传入写命令的方法.我已经尝试使用脚本-f然后使用tail -f跟随while循环的输出但是因为我跟踪的终端没有启动写入它不会输出.不幸的是我没有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
我想不出任何明显的方法来做到这一点.这就是为什么……
你的shell接收来自的输入,并将其输出发送到某个终端
设备:
+-----------+ | | | bash | | | +-----------+ ^ | | | | v +----------------------+ | some terminal device | +----------------------+
当写入写入终端时,它将数据直接发送到同一终端设备.它不会靠近你的shell:
+-----------+ +-----------+ | | | | | bash | | write | | | | | +-----------+ +-----------+ ^ | | | | | | v v +----------------------+ | some terminal device | +----------------------+
因此,为了使您能够捕获通过写入发送的内容,您需要终端设备本身提供的一些钩子,我认为没有任何东西可以用来执行此操作.
那么脚本如何工作,为什么它不捕获写输出?
脚本也无法挂入终端设备.它真的想要在你的shell和你的终端之间插入它自己,但没有一个好方法直接这样做.
因此,它创建了一个新的终端设备(一个伪终端,也称为“pty”)并在其中运行一个新的shell.一个pty由两个方面组成:“master”,它只是一个字节流,和一个“slave”,看起来就像任何其他交互式终端设备.
新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 | +----------------------+
现在您可以看到对原始终端设备的写入会绕过所有内容,就像上面的简单情况一样:
+-----------+ | | | 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 | +----------------------+
如果您在此处将数据写入新终端的从属端,您将看到输出显示,因为它将出现在主端的数据流中,该脚本可以看到.您可以使用shell脚本中的tty命令找到新pty的名称.
不幸的是,这对写入没有帮助,因为您可能无法写入它:您的登录会话与原始终端相关联,而不是新终端,并且写入可能会抱怨您未登录但是如果你这样的话echo hello> / dev / pts / NNN,你会看到它确实出现在脚本输出中.