Bash
如何將多個參數傳遞給 su <USER> -c ‘command’
我想以非 root 使用者身份執行作曲家。所以我將主作曲家執行檔重命名為
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 ")")
注意:composer-call 是一個 php cli 腳本。
這是因為
"$@"
被擴展為單獨的單詞,並且第二個單詞(--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
案例有效的原因。而不是$@
你應該使用$*
which 當它被放在雙引號中時擴展為一個單詞:#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
章節中詳細了解它。
用於
--
分隔目標使用者的命令,這樣su
就不會嘗試解析其他參數:#composer.sh su nginx -- composer-call "${@}"
舉個例子:
user1 的 composer.sh:
#!/bin/sh set -x su otheruser -- /home/otheruser/composer-call "$@"
/home/otheruser/composer 呼叫:
#!/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