HTTP를 통해 접속된 서버에 터미널 제어 권한을 부여합니다.

HTTP를 통해 접속된 서버에 터미널 제어 권한을 부여합니다.

HTTP 서버를 실행하는 응용 프로그램이 있습니다. 응용 프로그램에는 명령줄 인터페이스도 있습니다. 애플리케이션은 Ruby로 작성되었으며 시작하는 데 오랜 시간이 걸립니다. 이러한 이유로 명령줄 인터페이스를 사용하는 것은 매우 느립니다.

# this is slow
$ my-app do something

나는 종종 HTTP 서버의 인스턴스를 로컬에서 실행합니다. 저는 CLI에 대한 일종의 탭인 서버에 대한 엔드포인트를 작성했습니다. 일련의 매개변수(예: 명령줄의 ARGV)를 승인하고 서버 프로세스에서 해당 CLI 명령을 실행합니다.

# this is faster since the command is executed in the already-running process
$ curl http://my.app/cli?argv=do&argv=something

서버가 실행되는 동안 CLI 대신 이 엔드포인트를 사용하고 싶습니다. 내 문제는 다음과 같습니다. 내 CLI 명령 중 일부는 대화형입니다. 서버에 요청하면 curl서버 프로세스가 아닌 터미널에 대한 읽기/쓰기 액세스 권한을 얻습니다. 명령줄에서 직접 실행하는 것처럼 http 요청을 사용하여 대화형 명령을 실행할 수 있도록 서버에 터미널에 대한 임시 액세스 권한을 부여하는 방법이 있습니까? 한 가지 가능성은 서버에서 명명된 파이프를 열고 HTTP 요청에 대한 경로를 반환하는 것입니다. 그렇다면 터미널을 이것에 어떻게 "연결"합니까?

# this lets me interact with the command
$ my-app do something

# this does not
$ curl http://my.app/cli?argv=do&argv=something

답변1

http를 통해 터미널 장치 파일의 경로를 전달함으로써 이 문제를 해결할 수 있었습니다. 다음을 통해 이 경로를 얻을 수 있습니다.tty

$ curl http://my.app/cli?argv=do&argv=something&tty=$(tty)

그런 다음 서버에서 전달된 tty 파일을 열고 해당 파일을 읽고 씁니다(STDIN/STDOUT 아님).

관련 정보