httpd
обычно не является командой, которая находится в пути входа по умолчанию. Вам лучше явно указать полный путь к исполняемому файлу, например. / usr / sbin / httpd
.
Замените последнюю строку на:
exec su someuser -c '/tmp/elasticsearch-6.4.2/bin/elasticsearch "$@"' -- dummy-argv0 "$@"
Как правило, это способ передачи аргументов через команду su
:
su user -c 'command "$@"' -- argv0 "$@"
Вы должны опустить --
в системах, отличных от -linux.
su
синопсис на справочной странице(su [options] [username]
)вводит в заблуждение, вот немного слов из-под него:
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.
Вы также должны заменить все echo
на printf '%s\n'...
, так как echo
, встроенный в bash
и zsh
, и /bin/echo
из Linux, сами будут использовать аргумент -E
(совершенно противоположно тому, что требует стандарт ). Как правило, нет никакого способа безопасно использовать echo
с переменными, которые могут расширяться до -n
, -e
или -E
.
Примечание:
Использование "$@"
— единственный способ сохранить аргументы в том виде, в каком они были переданы. --Любая вариация su -c "command $*"
будет работать, только если ни один из аргументов не содержит пробелов или любых других специальных символов, которые могут быть интерпретированы оболочка. Даже текущий пример может быть легко подорван с помощью mkdir -p repositories.url.allowed_urls=http:/snapshot.test.only.ME.and.ME.and.ME
в домашнем каталоге someuser
.