user1の作曲家。sh:

user1の作曲家。sh:

ルート以外のユーザーとして作曲家を実行したいです。だから私はメインライターの実行可能ファイルの名前をに変更しcomposer-callcomposer

#composer.sh
su nginx -c "composer-call ${@}" 

今すぐ実行するとcomposer --version機能しますが、より複雑なパラメータを渡している間にcomposer create-project drupal-composer/drupal-project:8.x-dev some-dir --stability dev --no-interactionエラーが表示されます。

+ su nginx -c 'composer-call create-project' drupal-composer/drupal-project:8.x-dev some-dir --stability dev --no-interaction
su: unrecognized option: stability

アップデート1

以下のジェフの答えに基づいて彼の答えを試しましたが、別のエラーが発生しました。より良いソリューションを期待します。

composer-call: line 2: can't open ?php: no such file
composer-call: line 3: /bin: Permission denied
+ su nginx -- composer-call composer-call docker-php-entrypoint docker-php-ext-configure docker-php-ext-enable docker-php-ext-install docker-php-source drupal drush pear peardev pecl phar phar.phar php php-config phpdbg phpize This file is part of Composer.
su: must be suid to work properly
+ su nginx -- composer-call composer-call docker-php-entrypoint docker-php-ext-configure docker-php-ext-enable docker-php-ext-install docker-php-source drupal drush pear peardev pecl phar phar.phar php php-config phpdbg phpize
su: must be suid to work properly
composer-call: line 6: syntax error: unexpected word (expecting ")")

注:作曲家の呼び出しはPHP cliスクリプトです。

答え1

追加の引数が解析されないように、ターゲットユーザーを区別する--ために使用されるコマンド:su

#composer.sh
su nginx -- composer-call "${@}" 

たとえば、

user1の作曲家。sh:

#!/bin/sh
set -x
su otheruser -- /home/otheruser/composer-call "$@"

/home/otheruser/composer-call:

#!/bin/sh
echo Hi, I am composer-call, with arguments:
printf '%s\n' "$@"

実行中:

./composer.sh create-project drupal-composer/drupal-project:8.x-dev some-dir --stability dev --no-interaction
+ su otheruser -- /home/otheruser/composer-call create-project drupal-composer/drupal-project:8.x-dev some-dir --stability dev --no-interaction
Password:
Hi, I am composer-call, with arguments:
create-project
drupal-composer/drupal-project:8.x-dev
some-dir
--stability
dev
--no-interaction

答え2

これは"$@"、拡張が別々の単語で行われ、2番目の単語(--stabilityあなたの場合)がオプションとして扱われるためですsu。以下は、lsコマンドとして使用された例です。

#composer.sh
set -x
su nginx -c "ls $@"

出力1:

$ ./composer.sh -l -a
++ su nginx -c 'ls -l' -a
su: invalid option -- 'a'
Try 'su --help' for more information.

最初の引数(-l)のみに渡された文字列に含まれます-c。これがあなたの--versionイベントが機能する理由です。代わりに二重引用符で囲まれている場合は、単一の単語で拡張を$@使用する必要があります。$*

#composer.sh
set -x
su nginx -c "ls $*"

出力2:

$ ./composer.sh -l -a
++ su nginx -c 'ls -l -a'
total 12
drwxr-xr-x 2 root root 4096 Apr 22 11:05 .
drwxr-xr-x 1 root root 4096 Apr 22 11:05 ..
-rwxr-xr-x 1 root root   28 Apr 22 11:05 composer.sh
-rw-r--r-- 1 root root    0 Apr 22 11:05 test.txt

これで、すべてのパラメータが-c正しい結果を生成します。

man bash「リソース」セクションで、これについての詳細を学ぶことができますSpecial Parameters

答え3

最後に、here-docブロックに作曲家のコマンドをラップするのが役立ちました。

#!/bin/sh

su nginx -s /bin/sh <<EOF
composer-call "$@"
EOF

以下のコードを使用して、プログラムで上記のラッパースクリプトを作成しました。 :)

printf '%s\n' "#!/bin/sh" "su nginx -s /bin/sh <<EOF" "composer-call \$@" "EOF" > /usr/local/bin/composer

それを除いて数を実行また良い選択です。これはこのようにインストールできる小さなソフトウェアです。apk add su-exec

関連情報