我在Openresty构建下运行Nginx,因此启用了Lua脚本。我想创建一个URI位置(除了IP白名单外,还将使用SSL +身份验证来保护它),该位置允许来自授权源的webhooks调用使用根权限在服务器上执行bash脚本。例如
https://someserver.com/secured/exec?script=script.sh¶m1=uno¶m2=dos
NGINX将使用'script'和'param#'GET请求参数在shell中执行“ script.sh uno dos”。它捕获脚本输出和bash返回代码(如果可能)。
我了解以root用户身份运行NGINX和运行任意命令的安全性,但是如上所述,对URI的访问将得到保护。
是否可以通过本地NGINX模块或Lua脚本实现?有任何示例代码可以帮助我入门吗?
谢谢。
还有另一种可能的解决方案,不需要额外的nginx lua插件。这正在使用socat
。在端口8080
上启动socat,该端口在每个连接上执行bash脚本
socat TCP4-LISTEN:8080,reuseaddr,fork EXEC:./test.sh
Run Code Online (Sandbox Code Playgroud)
test.sh
#!/bin/bash
recv() { echo "< $@" >&2; }
read r line
line=${line%%$'\r'}
recv "$line"
read -r REQUEST_METHOD REQUEST_URI REQUEST_HTTP_VERSION <<<"$line"
declare -a REQUEST_HEADERS
while read -r line; do
line=${line%%$'\r'}
recv "$line"
# If we've reached the end of the headers, break.
[ -z "$line" ] && break
REQUEST_HEADERS+=("$line")
done
eval $(echo $REQUEST_METHOD | awk -F? '{print $2}' | awk -F'&' '{for (i=1;i<=NF;i++) print $i}')
cat <<END1
HTTP/1.1 200 OK
Content-Type: plain/text
REQUEST_METHOD=$REQUEST_METHOD
REQUEST_URI=$REQUEST_URI
REQUEST_HTTP_VERSION=$REQUEST_HTTP_VERSION
REQUEST_HEADERS=$REQUEST_HEADERS
script=$script
param1=$param1
param2=$param2
END1
Run Code Online (Sandbox Code Playgroud)
而对卷曲的测试如下
$ curl "localhost:8080/exec?script=test2.sh¶m1=abc¶m2=def"
REQUEST_METHOD=/exec?script=test2.sh¶m1=abc¶m2=def
REQUEST_URI=HTTP/1.1
REQUEST_HTTP_VERSION=
REQUEST_HEADERS=Host: localhost:8080
script=test2.sh
param1=abc
param2=def
Run Code Online (Sandbox Code Playgroud)
因此,您可以proxy_pass
在nginx中轻松使用它。
如果需要使用socat在bash中查看完整的服务器,请查看https://github.com/avleen/bashttpd/blob/master/bashttpd
归档时间: |
|
查看次数: |
1479 次 |
最近记录: |