如何通过网络管道与正在运行的进程进行终端交互?

如何通过网络管道与正在运行的进程进行终端交互?

如何运行一个希望在终端中执行的程序,使其 STDIO 可以任意远程连接?

具体来说,我希望能够在一台主机上启动 gdb 并远程连接到它的终端界面,这样我就可以使用 CTRL+C 暂停执行、更改布局(例如layout regs)等。下图说明了我正在尝试的内容去完成。

远程连接GDB客户端

到目前为止,我得到的最接近的是socat在远程主机上使用来创建 pty 并启动 gdb:

$ socat PTY,link=$HOME/somedev,rawer, SYSTEM:"gdb 2>&1",pty

然后将该 PTY 通过管道传输到 netcat 侦听器或从 netcat 侦听器传输:

$ cat ~/somedev | nc -l 5556 > ~/somedev

在工作站上启动 netcat:

$ nc <remote_host> 5556

我现在所拥有的接近我想要的,但终端交互有点不稳定(例如,如果我更改 gdb 的布局,一开始看起来还不错,但新行的出现会扰乱窗口的对齐等。 ),并且 CTRL+C 不会转发到 gdb 进程来挂起该进程。

我承认,其中一些行为可能是由于 netcat 的限制 - 我愿意接受其他程序来连接到远程主机上的 tcp 侦听器。

解决方案的一些其他限制:

  • gdb 进程必须独立于正在建立的远程连接而启动(换句话说,我无法使用 socat 来启动 gdb 进程,如 中所示socat TCP-LISTEN:5556,reuseaddr,fork EXEC:"gdb")。这也消除了涉及在工作站而不是远程主机上运行 gdb 的解决方案。
  • 在工作站终端上输入的 CTRL+C 必须导致SIGINT发送到 gdb 进程。

答案1

连接到远程主机的标准解决方案是SSH我在你的问题中没有看到任何排除这种可能性的内容。终端转发是 SSH 的内置功能。

gdb 进程必须独立于正在建立的远程连接而启动

为此,在 a 内启动它屏幕或者多路复用器会议。然后使用 SSH 连接到该会话。


Netcat只转发数据。终端的接口不仅仅包括通过终端交换的数据:它还需要处理读写控制调用,否则某些功能将无法工作,例如允许应用程序查询终端的大小,以及输入转换(例如转换Ctrl+C为 SIGINT 信号)。索卡特可以做到如果你没说错的话,但是使用 SSH 会容易得多。

相关内容