ラッパースクリプトに渡された最初の引数は無視されました。

ラッパースクリプトに渡された最初の引数は無視されました。

だから、次のスクリプトがあります。

#!/bin/bash

echo '-------------------------'
echo $0
echo $1
echo $@
echo '-------------------------'

exec su -- someuser -c "/tmp/elasticsearch-6.4.2/bin/elasticsearch \"$@\""

横になる/usr/bin/elasticsearch-wrapper

次のパラメータを使用して実行すると、次のようになります。

elasticsearch-wrapper \
  -E cluster.name=elasticsearch-test-24efcbba4c68  \
  -E node.name=node-1  \
  -E http.port=9250  \
  -E path.data=/tmp/elasticsearch_test  \
  -E path.logs=/tmp/log/elasticsearch  \
  -E cluster.routing.allocation.disk.threshold_enabled=false  \
  -E network.host=127.0.0.1  \
  -E node.attr.testattr=test  \
  -E path.repo=/tmp  \
  -E repositories.url.allowed_urls=http://snapshot.test*  \
  -E discovery.zen.minimum_master_nodes=0  \
  -E node.max_local_storage_nodes=1  \
  -E logger.level=DEBUG 

結局、次のエラーが発生します。

root@24efcbba4c68:/app# elasticsearch-wrapper \
>   -E cluster.name=elasticsearch-test-24efcbba4c68  \
>   -E node.name=node-1  \
>   -E http.port=9250  \
>   -E path.data=/tmp/elasticsearch_test  \
>   -E path.logs=/tmp/log/elasticsearch  \
>   -E cluster.routing.allocation.disk.threshold_enabled=false  \
>   -E network.host=127.0.0.1  \
>   -E node.attr.testattr=test  \
>   -E path.repo=/tmp  \
>   -E repositories.url.allowed_urls=http://snapshot.test*  \
>   -E discovery.zen.minimum_master_nodes=0  \
>   -E node.max_local_storage_nodes=1  \
>   -E logger.level=DEBUG
-------------------------
/usr/bin/elasticsearch-wrapper

cluster.name=elasticsearch-test-24efcbba4c68 -E node.name=node-1 -E http.port=9250 -E path.data=/tmp/elasticsearch_test -E path.logs=/tmp/log/elasticsearch -E cluster.routing.allocation.disk.threshold_enabled=false -E network.host=127.0.0.1 -E node.attr.testattr=test -E path.repo=/tmp -E repositories.url.allowed_urls=http://snapshot.test* -E discovery.zen.minimum_master_nodes=0 -E node.max_local_storage_nodes=1 -E logger.level=DEBUG
-------------------------
cluster.name=elasticsearch-test-24efcbba4c68: -c: line 0: unexpected EOF while looking for matching `"'
cluster.name=elasticsearch-test-24efcbba4c68: -c: line 1: syntax error: unexpected end of file

したがって、出力を見ると、$@最初の-Eオプションが何らかの理由で除外され、エラーが発生していることがわかります。

出力は次のとおりです

cluster.name=elasticsearch-test-24efcbba4c68 -E node.name=node-1.....

しかし、次のようにする必要があります。

-E cluster.name=elasticsearch-test-24efcbba4c68 -E node.name=node-1....

-E(最初から欠落しているメモ)

しかし、なぜこのようなことが起こるのかよくわかりません。誰かがその理由を指摘できたら?

ベストアンサー1

最後の行を次に置き換えます。

exec su someuser -c '/tmp/elasticsearch-6.4.2/bin/elasticsearch "$@"' -- dummy-argv0 "$@"

一般に、以下はパラメータがコマンドを介して渡される方法ですsu

su user -c 'command "$@"' -- argv0 "$@"

--Linux以外のシステムではこれを無視する必要があります。

suマニュアルページ( )の概要su [options] [username]は欺瞞的です。その下にあるいくつかのフレーズは次のとおりです。

ユーザー名の後に追加のパラメータを指定できます。その場合、そのパラメータはユーザーのログインシェルに提供されます。

....

- 引数を使用して、suオプションをシェルに指定された引数と区別できます。

また、およびlinuxの組み込み機能は独自の引数をとるので、echoすべてのsをに置き換える必要があります(printf '%s\n' ...echobashzsh/bin/echo-E基準必要です)。通常、またはecho拡張可能な変数を安全に使用する方法はありません。-n-e-E

メモ:

usingは、"$@"渡されたパラメータを正確に保存する唯一の方法です。su -c "command $*"usingのバリエーションは、パラメータにスペースやシェルで解釈できる他の特殊文字が含まれていない場合にのみ機能します。現在の例もmkdir -p repositories.url.allowed_urls=http:/snapshot.test.only.ME.and.ME.and.ME.homeディレクトリのために簡単に壊れる可能性がありますsomeuser

おすすめ記事