
だから、次のスクリプトがあります。
#!/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' ...
echo
bash
zsh
/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
。