使用 NodeJS + 实时输出从 Web 运行 Linux 命令

Posted

技术标签:

【中文标题】使用 NodeJS + 实时输出从 Web 运行 Linux 命令【英文标题】:Running Linux Commands From The Web With NodeJS + Real Time Output 【发布时间】:2012-02-24 15:52:55 【问题描述】:

简单地说,有可能实现从 php 脚本向 nodeJS 服务器发送命令的最佳方法是什么(与从客户端 js 发送命令相比,服务器端阻止用户发送自定义和破坏性命令)到 nodejs 服务器,然后运行这些命令并将实时输出发送回网页。

到目前为止,我能想到的是使用 php curl 将命令发送到 nodeJS websocket(socket.io),然后 nodeJS 服务器通过 eventsource/socket.io 客户端中继输出。

这样做的目的是通过用户设置的命令和任务的实时输出来管理来自网络的 VPS。 nodejs 服务器将在 VPS 服务器上运行并分拆子进程来运行每个命令。如果可能的话,那么我认为它会变得越来越难,因为每个客户端应该只能看到它们运行的​​命令的结果,因此传入的 php 套接字和传出的事件源将需要如何链接?

有什么想法吗? 干杯。

【问题讨论】:

那么你想要的是在每个系统上都有一个基于网络的终端吗? 简单来说,是的,用户可以登录并在 vps 上运行 set commmands(重启等,移动文件,防火墙),仅从那里命令实时输出。 那么你为什么不创建这些限制并给他们一个终端呢?我很感激希望它漂亮,但将其作为终端并没有获得任何好处,除了命令的特定简洁性...... 【参考方案1】:

您只需运行 child_process.exec() 并将进程 stdout 和 stderr 传送到 http 响应 - 仅此而已。

我看到的唯一障碍是,如果您想让用户运行他们想要的任何命令,Node 应用程序不一定知道 MIME 类型来告诉浏览器响应是。而且在您需要发送 HTTP 响应代码时,您不一定知道该进程是否成功 - 所以如果您真的想使用 500 Internal Server Error 如果远程进程退出非零,您将需要缓冲输出直到进程退出,或者等待一段时间并假设如果它在 N 秒后没有失败,它就不会失败。

我假设您意识到通过发出 http 请求让进程在远程计算机上远程运行临时程序是非常危险的,原因与可以运行的程序一样多。

下面是一个示例,说明如何从 Web 获取请求、通过程序将它们通过管道传输并返回到响应中。它需要一个传入的图像文件,使用netpbmpotrace 将其转换为 SVG 并将结果发送回客户端,而无需将其写入磁盘 - unix 管道是一件很棒的事情。您需要安装 Linux 或类似软件,安装 netpbm 和 potrace 才能实际使用它: https://timboudreau.com/code/traceservice/file/tip/traceservice.js

【讨论】:

以上是关于使用 NodeJS + 实时输出从 Web 运行 Linux 命令的主要内容,如果未能解决你的问题,请参考以下文章

你会推荐 Python 或 NodeJS 来创建实时 Web 服务吗? [关闭]

是否有推荐的方法来获取 web 应用程序的实时数据?

如何使用NodeJS中的firebase云功能从firebase实时数据库中找出最近的位置LatLng

Jupyter notebook 中 Python 子进程的实时标准输出输出

Nodejs telnet 实时响应获取

《NodeJS开发指南》学习笔记