2017-09-27 15 views
1

OpenrestyビルドでNginxを実行しているので、Luaスクリプトが有効になっています。私は許可されたソースからのwebhooks呼び出しがroot権限を使用してサーバー上でbashスクリプトを実行できるようにするURIロケーション(IPホワイトリストに加えてSSL +認証で保護されます)を作成したいと思います。例えばNGINXのroot権限を持つbashスクリプトを実行して出力を取得できますか?

https://someserver.com/secured/exec?script=script.sh&param1=uno&param2=dos

nginxのは、 'スクリプト' と 'のparam#' を使用するシェルで "script.shの宇野ドス" を実行するための要求引数をGET。それは、スクリプトの出力とbashの戻りコード(可能ならば)を取得します。

NGINXをrootとして実行し、任意のコマンドを実行することによるセキュリティの影響を理解していますが、前述のようにURIへのアクセスは保護されます。

これは、ネイティブのNGINXモジュールまたはLuaスクリプトによって可能ですか?私を始めるためのサンプルコードは何ですか?

ありがとうございます。

+0

使用を見てhttps://github.com/jprjr/lua-resty-execかhttps://github.com/juce/ルアレジーシェル。 Sockprocをrootとして起動します。 –

+0

ありがとうございます。 'デーモンの実行を必要としない方法があるのだろうか。 lua os.executeはシェルコマンドを実行できますが、出力またはステータスコードを返すことはできません。私はbashラッパースクリプトを作成することを考えました。スクリプトはスクリプト名とそれをargs(それは独自の引数)として実行します。そして、Luaで読み込みできるように、出力と終了コードをテキストファイルにダンプします。 Probは、ラッパースクリプトに一意のIDを渡して、2つの呼び出しが同じファイルに書き込まれないようにするために、ファイル名として使用する必要があります。誰かがよりクリーンなソリューションを考えることができるのだろうかと思います。 – bobbybay

+0

https://stackoverflow.com/questions/132397/get-back-the-output-of-os-execute-in-lua –

答えて

0

余分な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&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 

以下の通りですnginxのproxy_passにこれを簡単に使用できます。

あなたがsocatに関するを使用してbashで、完全なサーバーを参照してください必要がある場合は、https://github.com/avleen/bashttpd/blob/master/bashttpd

関連する問題