O primeiro argumento passado para o script wrapper é ignorado

4

Então, eu tenho o seguinte script:

#!/bin/bash

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

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

Localizado em /usr/bin/elasticsearch-wrapper

Agora, quando eu executo com os seguintes argumentos:

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 

Acabo com o seguinte erro:

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

Portanto, observar a saída de $@ mostra que a primeira opção -E está, por algum motivo, excluída, o que resulta no erro.

A saída foi:

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

mas deve ser:

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

(observe a falta de -E desde o início)

Mas não sei por que esse é o caso se alguém puder apontar o motivo?

    
por kurupt_89 03.11.2018 / 15:00

1 resposta

4

Substitua sua última linha por:

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

Geralmente, esta é a maneira de passar argumentos através do comando su :

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

Você deve omitir o -- em sistemas não-linux.

A sinopse de

su na página de manual ( su [options] [username] ) é enganosa, aqui está um palavreado abaixo dela:

Additional arguments may be provided after the username, in which case they are supplied to the user's login shell.

....

You can use the -- argument to separate su options from the arguments supplied to the shell.

Você também deve substituir todos os echo s por printf '%s\n' ... , pois os echo incorporados de bash e zsh e /bin/echo do linux usarão o argumento -E (totalmente contrário ao que o padrão exige). Geralmente, não há como usar com segurança echo com variáveis que podem se expandir para -n , -e ou -E .

Nota:

Usar "$@" é a única maneira de preservar os argumentos exatamente como foram passados - qualquer variação de su -c "command $*" funcionará somente enquanto nenhum argumento contiver espaços ou quaisquer outros caracteres especiais que possam ser interpretados pelo shell . Até mesmo o exemplo atual poderia ser facilmente subvertido por um mkdir -p repositories.url.allowed_urls=http:/snapshot.test.only.ME.and.ME.and.ME no diretório inicial de someuser .

    
por 03.11.2018 / 21:16