将终端控制权交给通过 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)即可。

相关内容