네트워크 파이프를 통해 실행 중인 프로세스와 터미널 상호 작용을 수행하는 방법은 무엇입니까?

네트워크 파이프를 통해 실행 중인 프로세스와 터미널 상호 작용을 수행하는 방법은 무엇입니까?

STDIO가 원격으로 연결될 수 있도록 터미널에서 실행하려는 프로그램을 어떻게 실행합니까?

특히, 한 호스트에서 gdb를 시작하고 해당 터미널 인터페이스에 원격으로 연결하여 CTRL+C를 사용하여 실행을 일시 중지하고 레이아웃(예: layout regs)을 변경할 수 있기를 원합니다. 아래 이미지는 제가 달성하려는 작업을 보여줍니다.

GDB 클라이언트에 원격으로 연결

지금까지 내가 얻은 가장 가까운 방법은 다음 socat을 사용하여 pty를 만들고 원격 호스트에서 gdb를 시작하는 것입니다.

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

그런 다음 이 PTY는 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를 입력하면 SIGINTgdb 프로세스로 전송되어야 합니다.

답변1

원격 호스트에 연결하기 위한 표준 솔루션은 다음과 같습니다.SSH귀하의 질문에는 이러한 가능성을 배제하는 내용이 없습니다. 터미널 전달은 SSH에 내장된 기능입니다.

gdb 프로세스는 원격 연결 설정과 별도로 시작되어야 합니다.

이렇게 하려면화면또는멀티플렉서회의. 그런 다음 SSH를 사용하여 세션에 연결합니다.


Netcat은 데이터만 전달합니다. 터미널의 인터페이스는 터미널을 통해 교환되는 데이터 그 이상으로 구성됩니다. 처리도 필요합니다.I/W 제어그렇지 않으면 애플리케이션이 터미널 크기를 쿼리하도록 허용하고 입력 변환(예: Ctrl+CSIGINT 신호로 변환)과 같은 특정 기능이 작동하지 않습니다.소캣은 할 수 있어당신이 틀리지 않았다면 SSH를 사용하는 것이 훨씬 쉬울 것입니다.

관련 정보