#remote-control #script #pty #command-output #tee #tty #process-file

app teetty

有点像tee,有点像script,但都是在一个虚拟的tty上。允许您远程控制和监视进程。

8个版本

0.4.0 2024年8月19日
0.3.1 2023年1月23日
0.3.0 2022年12月30日
0.2.3 2022年12月27日
0.1.0 2022年12月23日

#41 in 操作系统

Download history 140/week @ 2024-08-16

140 每月下载量

Apache-2.0

33KB
502

teetty

Crates.io License rustc 1.63.0

teetty 是一个包装二进制文件,用于在pty中执行命令,同时提供远程控制功能。

这允许将进程的stdout记录到文件中,而输出与不通过 teetty 传递时的输出没有区别。从程序的角度来看,它与终端连接在一起。然而,teetty 同时将输出复用到终端和可选的日志文件中,并且它还允许您在用户键盘仍然连接的情况下远程向程序发送输入。底层功能在 tty-spawn 包中提供。

您可以使用以下脚本安装预构建的二进制文件

$ curl -LsSf https://github.com/mitsuhiko/teetty/releases/latest/download/teetty-installer.sh | sh

或者您可以使用cargo自行构建

$ cargo install teetty

示例

在一个终端中,我们告诉 teetty 创建并连接到一个名为 stdin 的新 FIFO,将输出写入名为 stdout 的文件,并启动一个python进程。

$ teetty --in ./stdin --out ./stdout -- python
Python 3.8.12 (default, Mar  3 2022, 14:54:16)
[Clang 13.0.0 (clang-1300.0.29.30)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

我们可以通过在另一个窗口中用 tail -f 监视 stdout 文件来复用输出

$ tail -f ./stdout
Python 3.8.12 (default, Mar  3 2022, 14:54:16)
[Clang 13.0.0 (clang-1300.0.29.30)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

在另一个窗口中,我们现在可以远程控制这个python进程,并观察输出,既包括原始进程,也包括运行 tail 的窗口

$ echo 'import sys' > ./stdin
$ echo 'print(sys.version_info)' > ./stdin
>>> import sys
>>> sys.version_info
sys.version_info(major=3, minor=8, micro=12, releaselevel='final', serial=0)

脚本模式

默认情况下,teetty 打开一个pty并将其连接到应用程序。由于伪终端的工作方式,stdout和stderr将被合并。在这种模式下,终端将被置于原始模式,这意味着像Vim这样的应用程序,它想要移动光标,将能够正常工作。

teetty 提供了一种名为“脚本模式”的二级模式,可以通过 --script-mode 启用。在此模式下,标准输出和标准错误保持分离。这是通过将标准输出连接到伪终端,并将标准错误连接到二级内部 pty 来实现的。由于这不是可执行程序熟悉的设置,因此在启用原始模式时会导致各种视觉杂波。为了应对这种情况,在此模式下,分页器和原始模式将自动禁用。

关于流同步的说明:遗憾的是,在脚本模式下,目前 stdout/stderr 没有得到适当的同步。有关更多信息,请参阅 #6

FIFOs、刷新和控制字符

通常假设 --in 路径是一个 FIFO,但它也可以指向一个文件。对于 --out 参数,它作为 FIFO 或文件有显著差异。如果指向 FIFO,则写入将立即阻塞,直到有人开始从其中读取(例如,使用 cat)。另一方面,如果指向文件,则可以使用 tail -f 来读取它,但旧数据将积累在输出文件中。

默认情况下,输出会不断刷新,但可以通过传递 --no-flush 标志来禁用此功能。

连接的标准输入连接到终端。这意味着可以通过 FIFO 发送控制序列。例如,向进程发送 \x04 将尝试结束它。

echo -n $'\004' > ./stdin

以下是一些相关项目

  • faketty:模拟两个虚拟 ttys 以保留 stdout 和 stderr。这与 teetty 中的 --script-mode 类似。
  • script:大多数 UNIX 内置的工具,可以捕获终端的输出。
  • tmux:模拟整个终端,包括绘图表面等。允许您从多个终端会话中分离和重新连接。
  • expect:允许您编写交互式命令行工具的脚本。存在针对 Python 等编程语言的此工具的变体,例如 pexpect

依赖关系

~4–13MB
~163K SLoC