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 操作系统
140 每月下载量
33KB
502 行
teetty
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
。
许可证和链接
- 问题追踪器
- 许可证: Apache-2.0
依赖关系
~4–13MB
~163K SLoC