ルート以外のユーザーとして作曲家を実行したいです。だから私はメインライターの実行可能ファイルの名前をに変更しcomposer-call
、composer
。
#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