【问题标题】:When using php exec() to run shell scripts, one script works (which simply does git status) and one doesn't (which does git checkout). How come?当使用 php exec() 来运行 shell 脚本时,一个脚本可以工作(它只是执行 git status)而一个脚本不工作(它执行 git checkout)。怎么会?
【发布时间】:2012-06-26 14:07:33
【问题描述】:

我正在尝试设置一个基于 Web 的门户,通过该门户我们可以通过简单地单击后端面板来检查 Git 存储库的不同分支。

所以目前,我有 /var/www/devportal,其中包含 index.phpstatus.shcheckout.sh

index.php 我执行以下操作:

$repo = $_GET['repo'];
$command = 'sh status.sh ' . $repo;
$output = exec($command);
echo "<pre>$output</pre>";

status.sh的内容是:

#!/bin/bash -e
if [ $# -ne 1 ]
then
    echo "Usage: `basename $0` <repo name>"
    exit 1
fi
cd /var/www/$1
git status

这很好用。 PHP 中回显的输出显示了 /var/www/proj 中当前分支的状态。

现在,当我尝试使用 checkout.sh 做同样的事情(这次传递 2 个参数,第二个参数是要结帐的分支的名称)时,其内容是:

#!/bin/bash -e
if [ $# -ne 2 ]
then
    echo "Usage: `basename $0` <repo name> <branch name>"
    exit 1
fi
cd /var/www/$1
git checkout $2

它不起作用。它不仅不起作用,我也不会因为错误消息而深蹲。没有输出。我知道 checkout.sh 脚本工作正常,因为当我回显通过 PHP 的 exec 命令发送的命令时,复制该确切内容并通过以 root 身份登录的终端运行它,它工作得很好,执行结帐并返回新激活的分支的名称。

对此的任何提示将不胜感激。我的机器非常标准,Ubuntu 10.04 并运行 Apache2。

谢谢!

【问题讨论】:

  • 将标准错误重定向到标准输出,然后重试:exec($command . ' 2&gt;&amp;1')
  • 那太不安全了。想象$repo; rm -rf *

标签: php linux git shell exec


【解决方案1】:

exec 用您的命令标准输出填充 $output,以显示错误(如果有)在命令末尾添加“2>&1”。

exec也可以告诉你返回值,试试:

$output = exec($command, $array_output, $ret_val);
var_dump($ret_val);
echo "<pre>$output</pre>";

【讨论】:

  • 谢谢!当我在命令末尾添加“2>&1”时,它完全解决了问题!
【解决方案2】:
$repo = $_GET['repo'];
$command = 'sh status.sh ' . $repo;
$output = exec($command);

天哪。不要这样做。 escapeshellarg 存在是有原因的

【讨论】:

  • 非常感谢。这很有帮助,我不知道。欣赏它。
猜你喜欢
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
相关资源
最近更新 更多