有没有办法将 shell 连接到伪终端?

Is there a way to connect a shell to a pseudo tty?

如果我有一个(已编译的)后台进程(在 GNU/Linux 上),例如守护进程,使用 openpty() 或类似的方法为自己创建一个伪 tty , 有没有办法从 shell 连接到它,例如打开面向命令行的界面(例如,用于动态调试/重新配置它)。

这与这里的问题非常相似:

有人建议 他们使用屏幕和 minicom 连接到它,但我不太清楚如何连接。我原以为 screen 只能连接到由 screen 创建的屏幕。

理想情况下,我想使用标准命令行工具连接到守护进程 或者提供一个轻量级的程序来完成必要的工作。

目标是比实现全面的客户端服务器实现(并使用 ttys)更简单。

这是 的精简版,有点模糊。

我原来的问题因为没有明确的重点而被关闭。我这里有一个替代品:

这个问题侧重于描述的用例的一个方面。 如果我在自己的 pty 中有一个应用程序 运行 是否有一种方法可以将该 tty 链接到现有的终端会话。

实际上应用程序是 'backgrounded' 但在隐藏终端中是 运行。你如何让你的终端连接到那个 'backgrounded' 终端。

我想你需要这样的东西:

  1. a select 循环转发 stdin 和 stdout 到 pty 的主端
  2. 将 SIGWINCH 转发到 pty 以调整其大小以匹配您的终端(反之亦然)。

该问题假设您只有一个服务器进程,但实际上您需要两个。

一个进程是您的 'backgrounded' 使用 pty 从端的应用程序。

另一个进程将是管理 pty 的主端的助手。 主端必须始终保持打开状态。主文件描述符关闭时删除 pty 对。

slave端的后台应用,读写到最后。 主端决定如何处理这些读取和写入。

要从另一个终端连接,您需要告诉主端将读取和写入发送到哪里。

您可以给它指定您正在使用的 pty 终端的名称。然后管理主端的进程可以适当地转发读取和写入。

仅此一项对于某些应用程序是不够的。特别是如果终端的大小发生变化,应用程序应该收到 SIGWINCH。主人需要以某种方式将其传递给奴隶。终端功能也可能不同,需要翻译。

要处理这些问题,您的客户端需要第三个进程,该进程与进程 运行ning pty 的主端对话。这就是 screentmux 的工作方式。

所以没有标准的程序可以满足您的需求,因为没有标准的方法来处理这个问题。像 screen 这样的程序有自己的方式,但在大多数情况下可以按原样使用。

to the 中,OP(关于那个问题)使用原始模式的终端,这可能意味着这些并发症不适用。 例如,如果您只想从主机转发 stdout 一个 pty 名称以将输出复制到就足够了。

另一方面,screen 程序为每个虚拟屏幕创建一个套接字(运行ning 在 pty 的主控端)。 screen 可执行文件 运行ning(在不同模式下)作为客户端进程连接到该套接字以与应用程序对话。

鉴于 screen 和 tmux 明确设计用于执行此操作,您不清楚自己执行此操作会获得什么优势。 然而,这可能是一个有趣的学习练习。

更好地描述了您的用例。 您无法使用屏幕按需创建新的用户界面。 它确实很好地处理了前台和后台用例,只要您记得从一开始就 运行 屏幕下的进程,其中屏幕附加和分离命令将取代直接使用 bgfg.