3

バックエンド パネルをクリックするだけで、Git リポジトリのさまざまなブランチをチェックアウトできる Web ベースのポータルをセットアップしようとしています。

現在、 index.phpstatus.sh、およびcheckout.shを含む /var/www/devportal があります。

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 つのパラメーターを渡し、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

うまくいきません。うまくいかないだけでなく、エラーメッセージにうんざりすることもありません。出力はありません。PHPのexecコマンドを介して送信されたコマンドをエコーし​​ 、その正確なものをコピーし、rootとしてログインしたターミナルを介して実行すると、正常に動作し、チェックアウトを行い、新しくアクティブ化されたブランチの名前。

これに関するヒントは大歓迎です。私のボックスはかなり標準的なUbuntu 10.04で、Apache2を実行しています。

ありがとう!

4

2 に答える 2

4

exec は $output にコマンドの標準出力を入力し、エラー (存在する場合) を表示するには、コマンドの最後に "2>&1" を追加します。

exec は戻り値も教えてくれます。試してみてください:

$output = exec($command, $array_output, $ret_val);
var_dump($ret_val);
echo "<pre>$output</pre>";
于 2012-06-25T10:26:07.800 に答える
0
$repo = $_GET['repo'];
$command = 'sh status.sh ' . $repo;
$output = exec($command);

ああイエス様。これをしないでください。理由によりescapeshellargが存在する

于 2012-06-25T14:30:35.057 に答える