有没有办法将 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' 终端。
我想你需要这样的东西:
- a select 循环转发 stdin 和 stdout 到 pty 的主端
- 将 SIGWINCH 转发到 pty 以调整其大小以匹配您的终端(反之亦然)。
该问题假设您只有一个服务器进程,但实际上您需要两个。
一个进程是您的 'backgrounded' 使用 pty 从端的应用程序。
另一个进程将是管理 pty 的主端的助手。
主端必须始终保持打开状态。主文件描述符关闭时删除 pty 对。
slave端的后台应用,读写到最后。
主端决定如何处理这些读取和写入。
要从另一个终端连接,您需要告诉主端将读取和写入发送到哪里。
您可以给它指定您正在使用的 pty 终端的名称。然后管理主端的进程可以适当地转发读取和写入。
仅此一项对于某些应用程序是不够的。特别是如果终端的大小发生变化,应用程序应该收到 SIGWINCH
。主人需要以某种方式将其传递给奴隶。终端功能也可能不同,需要翻译。
要处理这些问题,您的客户端需要第三个进程,该进程与进程 运行ning pty 的主端对话。这就是 screen
和 tmux
的工作方式。
所以没有标准的程序可以满足您的需求,因为没有标准的方法来处理这个问题。像 screen 这样的程序有自己的方式,但在大多数情况下可以按原样使用。
在 to the 中,OP(关于那个问题)使用原始模式的终端,这可能意味着这些并发症不适用。
例如,如果您只想从主机转发 stdout 一个 pty 名称以将输出复制到就足够了。
另一方面,screen
程序为每个虚拟屏幕创建一个套接字(运行ning 在 pty 的主控端)。 screen
可执行文件 运行ning(在不同模式下)作为客户端进程连接到该套接字以与应用程序对话。
鉴于 screen 和 tmux 明确设计用于执行此操作,您不清楚自己执行此操作会获得什么优势。
然而,这可能是一个有趣的学习练习。
更好地描述了您的用例。
您无法使用屏幕按需创建新的用户界面。
它确实很好地处理了前台和后台用例,只要您记得从一开始就 运行 屏幕下的进程,其中屏幕附加和分离命令将取代直接使用 bg
和 fg
.
如果我有一个(已编译的)后台进程(在 GNU/Linux 上),例如守护进程,使用 openpty() 或类似的方法为自己创建一个伪 tty , 有没有办法从 shell 连接到它,例如打开面向命令行的界面(例如,用于动态调试/重新配置它)。
这与这里的问题非常相似:
有人建议
理想情况下,我想使用标准命令行工具连接到守护进程 或者提供一个轻量级的程序来完成必要的工作。
目标是比实现全面的客户端服务器实现(并使用 ttys)更简单。
这是 的精简版,有点模糊。
我原来的问题因为没有明确的重点而被关闭。我这里有一个替代品:
这个问题侧重于描述的用例的一个方面。 如果我在自己的 pty 中有一个应用程序 运行 是否有一种方法可以将该 tty 链接到现有的终端会话。
实际上应用程序是 'backgrounded' 但在隐藏终端中是 运行。你如何让你的终端连接到那个 'backgrounded' 终端。
我想你需要这样的东西:
- a select 循环转发 stdin 和 stdout 到 pty 的主端
- 将 SIGWINCH 转发到 pty 以调整其大小以匹配您的终端(反之亦然)。
该问题假设您只有一个服务器进程,但实际上您需要两个。
一个进程是您的 'backgrounded' 使用 pty 从端的应用程序。
另一个进程将是管理 pty 的主端的助手。 主端必须始终保持打开状态。主文件描述符关闭时删除 pty 对。
slave端的后台应用,读写到最后。 主端决定如何处理这些读取和写入。
要从另一个终端连接,您需要告诉主端将读取和写入发送到哪里。
您可以给它指定您正在使用的 pty 终端的名称。然后管理主端的进程可以适当地转发读取和写入。
仅此一项对于某些应用程序是不够的。特别是如果终端的大小发生变化,应用程序应该收到 SIGWINCH
。主人需要以某种方式将其传递给奴隶。终端功能也可能不同,需要翻译。
要处理这些问题,您的客户端需要第三个进程,该进程与进程 运行ning pty 的主端对话。这就是 screen
和 tmux
的工作方式。
所以没有标准的程序可以满足您的需求,因为没有标准的方法来处理这个问题。像 screen 这样的程序有自己的方式,但在大多数情况下可以按原样使用。
在
另一方面,screen
程序为每个虚拟屏幕创建一个套接字(运行ning 在 pty 的主控端)。 screen
可执行文件 运行ning(在不同模式下)作为客户端进程连接到该套接字以与应用程序对话。
鉴于 screen 和 tmux 明确设计用于执行此操作,您不清楚自己执行此操作会获得什么优势。 然而,这可能是一个有趣的学习练习。
bg
和 fg
.