【问题标题】:How to run a python or bash script interactively on a webpage?如何在网页上以交互方式运行 python 或 bash 脚本?
【发布时间】:2020-10-30 14:00:10
【问题描述】:

我正在建立一个网站,我想在我的网页上显示一个终端,它以交互方式运行脚本(python 或 bash)。

类似于 trinket.io,但我想使用我的服务器上的 python 解释器或 bash,所以我可以安装 pip 包并控制脚本的各个方面。

我正在考虑类似交互式框架的东西,它显示终端和其中执行的内容,obv 支持用户交互。

一个很好的例子是https://create.withcode.uk/,这正是我想要的,但我想用我自己的模块和生态系统将它托管在我自己的服务器上。这在安全方面似乎也相当不错。

有类似的吗?

【问题讨论】:

  • 如果您设法做到这一点,请特别注意安全性,因为任何人都可以在您的机器上执行任意代码!
  • @smwhr 确实目标是运行一个脚本,仅此而已,就像一个固定终端,里面有“python script.py”,没有别的了
  • 如果您正在寻找用户交互性,我建议您使用诸如烧瓶或破折号之类的东西。提供与您所描述的类似的东西将很快被转换为 Web 攻击、主机服务器上的妥协以及谁知道还有什么的反弹点。
  • @r2evans 谢谢我会看看它,关于安全问题,如果终端的东西被固定在一个脚本上,这怎么可能是危险的?也许我错过了什么
  • 您提到的 “交互式框架”“显示终端” 让我尖叫着有人能够与解释器的 REPL 进行交互。即使唯一运行的是提示用户输入的脚本......我仍然发现任何类型的 REPL 与用户交互都会带来重大的安全风险。我相信以这种方式使用 python(等)的一般“最佳实践”是在 dash/flask/shiny(R 语言)基础设施之一中工作,该基础设施设计有围绕 a 的 HTML 实体(例如,输入框、操作按钮)反应式编程前提。

标签: python html bash web terminal


【解决方案1】:

如果我理解得很好,您会寻找一种允许您在 Web 服务器上显示终端的机制。

然后你想在那个终端上运行一个交互式python脚本,对吧。

所以说到底共享终端的解决方案不一定非得用python来写吧? (虽然我必须承认,如果我找到它们,我更喜欢 python 解决方案,但有时务实并不是一个坏主意)

您可以在 Google 上搜索 http 和终端模拟器。

也许 ttyd 符合要求。 https://github.com/tsl0922/ttyd

在 linux 上构建可以用

sudo apt-get install build-essential cmake git libjson-c-dev libwebsockets-dev
git clone https://github.com/tsl0922/ttyd.git
cd ttyd && mkdir build && cd build
cmake ..
make && make install

用法类似于: ttyd -p 8888 yourpythonscript.py

然后您可以使用http://hostip:8888 连接网络浏览器

您当然可以“隐藏”这个 url 到反向代理后面并添加身份验证 或添加--credential username:password 之类的选项来密码保护网址。

附录: 如果您想与不同的人共享多个脚本并且共享更多是即时的,那么您可以查看 tty-share (https://github.com/elisescu/tty-share) 和 tty-server (https://github.com/elisescu/tty-server)

tty-server 可以在 docker 容器中运行。 tty-share 可用于在您的一个终端上的机器上运行脚本。它将输出一个 url,您可以将其提供给您想要与之共享特定会话的人) 如果您认为这很有趣,我可能会详细说明这一点

【讨论】:

  • 天哪,这似乎正是我想做的,太棒了。一旦我让它工作,我会查看它并将其标记为答案。我想知道我是否也可以将它放入 iframe 中以用于 ex。在 Wordpress 或类似软件中。谢谢!
  • 我希望它有效我没有尝试,我只是用谷歌搜索。多年前我使用了另一种解决方案,但没有找到它
  • 如果它不起作用,那么您必须使用 Web 套接字编写自己的 Web 服务器(例如 django 和 django 通道,但也应该存在较小的解决方案),在 pty 中启动您的脚本并让您的 Web 服务器将 pty 中继到您的服务器。在浏览器端,您可以使用Xterm.js (xtermjs.org)(ttyd 使用的 Web 前端)来显示终端的内容
【解决方案2】:

>> 在此处插入安全免责声明

最简单的hacktastic方法是创建一个div元素来存储你的输出和一个input元素来输入命令。然后你可以将POST ajax 命令发送到后端控制器。

控制器将获取命令并运行它,同时捕获命令的输出并将其发送回网页以便它在div中呈现它

在 python 中,我使用它来捕获命令输出:

from subprocess import Popen, STDOUT, PIPE

proc = Popen(['ls', '-l'], stdout=PIPE, stderr=STDOUT, cwd='/working/directory')
proc.wait()
return proc.stdout.read()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2017-02-07
    • 1970-01-01
    • 2013-06-19
    相关资源
    最近更新 更多