如何运行一个希望在终端中执行的程序,使其 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 进程。