是否可以从NGINX以root权限执行bash脚本并获取输出?

1 lua nginx luajit openresty

我在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脚本实现?有任何示例代码可以帮助我入门吗?

谢谢。

Tar*_*ani 5

还有另一种可能的解决方案,不需要额外的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&param1=abc&param2=def"
REQUEST_METHOD=/exec?script=test2.sh&param1=abc&param2=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