Bash

如何將多個參數傳遞給 su <USER> -c ‘command’

  • April 22, 2022

我想以非 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

引用自:https://unix.stackexchange.com/questions/476155