user1의 작곡가.sh:

user1의 작곡가.sh:

루트가 아닌 사용자로 작곡가를 실행하고 싶습니다. 그래서 저는 주요 작성기 실행 파일의 이름을 로 바꾼 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

아래 Jeff의 답변을 바탕으로 그의 답변을 시도했지만 또 다른 오류가 발생했습니다. 더 나은 솔루션을 기대합니다.

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

이는 "$@"확장이 별도의 단어로 이루어지고 두 번째 단어( --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

관련 정보