我有一个运行 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)即可。