5 个版本 (2 个稳定版)
1.0.1 | 2024 年 1 月 27 日 |
---|---|
1.0.0 | 2024 年 1 月 24 日 |
0.2.1 | 2024 年 1 月 22 日 |
0.2.0 | 2024 年 1 月 22 日 |
0.1.0 | 2024 年 1 月 22 日 |
#267 在 网络编程
26KB
287 行
http-cmd
通过 HTTP 运行命令
⚠️ 警告 ⚠️
不要将 http-cmd
暴露在互联网上,特别是与执行代码(例如 python
)或命令(例如 bash
)的程序一起。否则,可能会执行任意代码和程序(即被黑客攻击)!
动机
构建此工具的动机是,像 Zola 这样的静态站点生成器出于安全原因不允许执行外部命令。您不希望在构建静态网站时执行任意程序!想象一下被第三方主题黑掉 😱
然而,此类静态站点生成器支持获取远程数据。这导致了 http-cmd
的工作原理的漏洞
- 💻️ 运行一个等待 POST 请求的本地 HTTP 服务器,并使用其正文作为标准输入或外部命令的命令参数
- ⬆️ 让静态站点生成器发送 POST 请求以运行外部命令
- ⬇️ 将响应正文嵌入为外部命令的输出
- 🎉 赚钱!
您可以在 zola_examples
目录中找到使用 http-cmd
与 Zola 的示例。
用例
以下是一些可能的用例
- ➗ 将 LaTeX 数学转换为 HTML
- 🖨️ 嵌入多语言代码块的输出
- 💻️ CLI 的演示
- 📊 从文本生成图表的嵌入
- 😃 将表情符号短码替换为 Unicode 表情符号
- ⚙️ 总体上,扩展静态站点生成器的功能
- 💭 您的想法
安装
您可以通过运行 Cargo 安装 http-cmd
。
cargo install http-cmd
您可以使用 cargo-update
更新它。
如果您不想与 Rust 工具链一起安装 Cargo,请提交一个问题,我将发布一个您可以用 Docker 或 Podman 运行的容器镜像。
配置
http-cmd
需要在执行目录中找到配置文件 http-cmd.toml
。但您也可以使用 -c
命令行选项提供配置文件的路径。
参数 | 描述 | 默认值 |
---|---|---|
ip |
要绑定的 IPv4/IPv6 地址 | "127.0.0.1" |
端口 |
监听端口 | 8080 |
max_request_body_size |
请求体最大字节数 | 1048576 (1 MiB) |
commands |
命令配置列表 | |
commands.name |
命令的名称。它用于在 http://IP:PORT/NAME 下执行命令。仅允许字符 a 到 z (小写)、0 到 9 和 - 。 |
|
commands.stdin |
请参阅下面的 模式 部分 | |
commands.program |
当调用 http://IP:PORT/NAME 时执行的程序。可以是可执行文件的绝对或相对路径。否则,将像运行 Unix which 命令一样搜索可执行文件 |
|
commands.args |
程序的参数列表 |
模式
http-cmd
有两种运行程序的模式。通过布尔配置值 stdin
选择模式
- 对于
stdin = true
,请求体被管道传输到命令的标准输入。 - 对于
stdin = false
,请求体被拆分为配置args
后提供的参数。请参阅下面的ls
命令示例。
演示
以下是一个示例配置文件
# The default
ip = "127.0.0.1"
# The default
port = 8080
# 2 KiB instead of the default of 1MiB
max_request_body_size = 2048
[[commands]]
name = "rev"
stdin = true
program = "rev"
args = []
[[commands]]
name = "ls"
stdin = false
program = "/usr/bin/ls"
args = ["-l"]
如果您将此配置保存到文件 http-cmd.toml
并运行 http-cmd
,则将启动一个服务器,监听 http://127.0.0.1:8080/rev
和 http://127.0.0.1:8080/ls
。
现在运行
curl http://127.0.0.1:8080/rev -d "Hello World!"
此命令发送一个包含正文 "Hello World!" 的 POST 请求。输出应该是反转的文本: "!dlroW olleH" 🎉
http-cmd
在这里设置 stdin
为 true
时执行的等效操作如下管道
echo -n "Hello World!" | rev
为了测试第二个命令,运行
curl http://127.0.0.1:8080/ls -d "src zola_examples"
输出取决于两个目录的内容。
此命令也发送 POST 请求,但由于为 ls
命令设置了 stdin
为 false
,因此应用了第二个 模式。这意味着 http-cmd
执行命令 ls -l src zola_examples
。参数 src
和 zola_examples
被放置在程序 ls
和其配置的参数之后(这里只有 -l
)。
依赖项
~11–22MB
~325K SLoC