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