2017-06-04 44 views
0

我有最简单的问题,我不确定我做错了什么。bash以不同的用户执行命令su

我用/ bin/sh的

的脚本中,我有以下有一个简单的shell脚本:

exec_as_wwwdata() { 
if [ $(whoami) = ${WWW_USER} ]]; then 
    [email protected] 
    else 
    su -s /bin/sh -c '[email protected]' ${WWW_USER} 
    fi 
} 

我与

exec_as_wwwdata composer config -g github-oauth.github.com $COMPOSER_GITHUB_TOKEN 

调用它,它只是什么都不做,没有任何错误信息。 如果我所说的直接脚本

su -s /bin/sh -c 'composer config -g github-oauth.github.com $COMPOSER_GITHUB_TOKEN' ${WWW_USER} 

它的作品里面以下。

我在这里做错了什么?

意见的基础上我已经改成了这个

exec_as_wwwdata() { 
if [ $(whoami) = ${WWW_USER} ]]; then 
    [email protected] 
    else 
    su -s /bin/sh -c '"[email protected]"' "$WWW_USER" _ "[email protected]" 
    fi 
} 

虽然当我用下面的参数

exec_as_wwwdata /usr/local/bin/php /usr/local/bin/composer create-project --repository-url=xxxx . 

我收到以下错误消息

su: unrecognized option '--repository-url= 

叫它我认为在字符串中存在问题。我该如何逃避?

+0

''''''不扩展变量。 – melpomene

+0

用''替换''''' – janos

+0

请注意''$ @“'(是的,引号很重要)将被视为* only *作为命令名称及其参数;无管道,无重定向,无'&& ''''''''运算符 – chepner

回答

0

这里有[email protected]有两种重叠的用法,而且您无意中偶然发现了部分正确的解决方案。 -c需要一个单词,而"[email protected]"会产生多个不同的单词。正确的解决办法是

su -s /bin/sh -c '"[email protected]"' "$WWW_USER" _ "[email protected]" 

短版:你不希望建立从当前参数的命令串;你想把它们作为参数传递给一个硬编码的命令字符串,让新的shell适当地扩展它。

细目:

  • -s /bin/sh - 使用/bin/sh代替相应的用户的登录shell
  • -c '"[email protected]"'运行命令"[email protected]",根据需要。请注意,这是一个硬编码的值;新外壳一旦启动就会正确地扩展其位置参数。
  • "$WWW_USER" - 指定用户运行shell为
  • _ - 在运行的shell中指定$0的值。你可能不在乎这个值是什么;你只需要一些占位符来防止你的第一个真正的论点被视为$0的值。
  • "[email protected]"通过当前位置参数作为参数传递给新的壳,这将扩大"[email protected]"于这些值。
+0

嗨,谢谢你的详细答案,它几乎工作。错误信息现在我收到了。谢谢你对此的任何建议! – Istvano

+0

仔细查看我的答案:我使用'-c'“$ @'',而不是'-c”$ @“'。 – chepner

+0

嗨,你是绝对正确的。我修改了这个问题。尽管我仍然遇到同样的错误。不知何故,似乎双短跑是一个问题。它适用于其他命令,但如果有像-repository这样的双连字符,它会停止并显示错误消息。任何想法为什么? – Istvano