![如何通过网络管道与正在运行的进程进行终端交互?](https://linux22.com/image/219946/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E7%BD%91%E7%BB%9C%E7%AE%A1%E9%81%93%E4%B8%8E%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%E8%BF%9B%E7%A8%8B%E8%BF%9B%E8%A1%8C%E7%BB%88%E7%AB%AF%E4%BA%A4%E4%BA%92%EF%BC%9F.png)
如何运行一个希望在终端中执行的程序,使其 STDIO 可以任意远程连接?
具体来说,我希望能够在一台主机上启动 gdb 并远程连接到它的终端界面,这样我就可以使用 CTRL+C 暂停执行、更改布局(例如layout regs
)等。下图说明了我正在尝试的内容去完成。
到目前为止,我得到的最接近的是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 进程。