余分なnginx luaプラグインを必要としない別の解決策があります。これはsocat
を使用しています。あなたはすべての接続でbashスクリプトを
test.sh
#!/bin/bash
recv() { echo "< [email protected]" >&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
カールでテストを実行し、ポート8080
にsocatに関するを開始ですから、
$ 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
以下の通りですnginxのproxy_pass
にこれを簡単に使用できます。
あなたがsocatに関するを使用してbashで、完全なサーバーを参照してください必要がある場合は、https://github.com/avleen/bashttpd/blob/master/bashttpd
使用を見てhttps://github.com/jprjr/lua-resty-execかhttps://github.com/juce/ルアレジーシェル。 Sockprocをrootとして起動します。 –
ありがとうございます。 'デーモンの実行を必要としない方法があるのだろうか。 lua os.executeはシェルコマンドを実行できますが、出力またはステータスコードを返すことはできません。私はbashラッパースクリプトを作成することを考えました。スクリプトはスクリプト名とそれをargs(それは独自の引数)として実行します。そして、Luaで読み込みできるように、出力と終了コードをテキストファイルにダンプします。 Probは、ラッパースクリプトに一意のIDを渡して、2つの呼び出しが同じファイルに書き込まれないようにするために、ファイル名として使用する必要があります。誰かがよりクリーンなソリューションを考えることができるのだろうかと思います。 – bobbybay
https://stackoverflow.com/questions/132397/get-back-the-output-of-os-execute-in-lua –