当使用php exec()运行shell脚本时,一个脚本工作(它只是git状态)而一个脚本没有(它执行git checkout)。 怎么会?

我正在尝试设置一个基于Web的门户,我们可以通过它来检查我们的Git存储库的不同分支 点击后端面板。</ p>

目前,我的/ var / www / devportal包含 index.php </ strong>, status.sh < / strong>和 checkout.sh </ strong> </ p>

index.php </ strong>中,我执行以下操作:</ p>

< pre> $ repo = $ _GET ['repo'];
$ command ='sh status.sh'。 $ repo;
$ output = exec($ command);
echo“&lt; pre&gt; $ output&lt; / pre&gt;”;
</ code> </ pre>

<的内容 strong> status.sh </ strong>是:</ p>

 #!/ bin / bash -e 
if [$#-ne 1]
then
echo“用法: basename $ 0&lt; repo name&gt;“
退出1
fi
cd / var / www / $ 1
git status
</ code> </ pre>

这很好用。 在PHP中回显的输出向我显示当前分支在/var/www/proj.


nn中的状态。当我尝试做同样的事情时(这次用第二个传递2个parms) 一个是结账的名称,用 checkout.sh </ strong>,其中包含的内容是:</ p>

 #!/ bin / bash -e

if [$#-ne 2]
then
echo“用法:basename $ 0&lt; repo name&gt;&lt; branch name&gt;”
exit 1
fi
cd / var / www / $ 1
git checkout $ 2

</ code> </ pre>

它不起作用。 它不仅不起作用,我不会因为错误消息而蹲下。 没有输出。 我知道checkout.sh脚本工作正常,因为当我回显通过PHP的exec命令发送的命令时,复制那个确切的东西并通过以root身份登录的终端运行它,它工作正常,检查并返回 新激活的分支的名称。</ p>

对此的任何提示将不胜感激。 我的盒子非常标准,Ubuntu 10.04并运行Apache2。</ p>

谢谢!</ p>
</ div>

展开原文

原文

I am trying to setup a web-based portal through which we can checkout different branches of our Git repository through a simple click on a back-end panel.

So currently, I have /var/www/devportal which contains index.php, status.sh and checkout.sh

In index.php I do the following:

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

The contents of status.sh are:

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

And this works just fine. The output echoed in PHP shows me the status of the current branch within /var/www/proj.

Now when I try to do the same thing (passing 2 parms this time with the second one being the name of the branch to checkout) with checkout.sh, who'se contents are:

#!/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

It doesn't work. Not only does it not work, I don't get diddly squat for an error message. There is no output. I know that the checkout.sh script works fine because when I echo the command that is being sent via PHP's exec command, copy that exact thing and run it via terminal logged in as root, it works just fine, does the checkout and returns the name of the newly activated branch.

Any tips on this would be greatly appreciated. My box is pretty standard, Ubuntu 10.04 and running Apache2.

Thanks!

duande1146
duande1146 这是如此不安全。想象$repo是;rm-rf*
8 年多之前 回复
douluan5738
douluan5738 将stderr重定向到stdout,然后再试一次:exec($command。'2>&1')
8 年多之前 回复

2个回答



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

exec也可以告诉您返回值,请尝试:</ p>

  $ output = exec($ command,$ array_output)  ,$ ret_val); 
var_dump($ ret_val);
echo“&lt; pre&gt; $ output&lt; / pre&gt;”;
</ code> </ pre>
</ div>

展开原文

原文

exec fills $output with your command standart output, to show error (if any) add "2>&1" at the end of your command.

exec can also tell you the return value, try:

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

dqg17080
dqg17080 谢谢! 当我在命令末尾添加“2>&1”时,它完全解决了问题!
8 年多之前 回复



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

哦,耶稣。 不要这样做。 escapeshellarg 因某种原因而存在</ p>
</ div>

展开原文

原文

$repo = $_GET['repo'];
$command = 'sh status.sh ' . $repo;
$output = exec($command);

Oh jesus man. Don't do this. escapeshellarg exists for a reason

douxian3170
douxian3170 非常感谢。 这非常有帮助,我不知道。 欣赏它。
8 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐