3

次の内容のシェルスクリプトdeploy.shがあります:-

echo "0 Importing the code"
eval "git pull -u origin master"

echo "1 Backing up existing data in database.."
// -- other code follows here

ターミナルを使用してスクリプトを直接実行すると、次の出力が得られます。-

0コードのインポート
リモート:オブジェクトのカウント:5、完了。
リモート:オブジェクトの圧縮:100%(2/2)、完了。
リモート:合計3(デルタ1)、再利用0(デルタ0)
オブジェクトの解凍:100%(3/3)、完了。
bitbucket.org:user/repoから
 *ブランチマスター->FETCH_HEAD
db13xxx..6705xxxを更新しています
1データベース内の既存のデータをバックアップします。

正解です。ただし、httpを介してdeploy.shスクリプトを呼び出すことができるPHPスクリプトを作成しました。このphpページの内容は次のとおりです。-

$output = `./deploy.sh`;
echo '<pre>', $output, '</pre>';

ブラウザからこのphpファイルを呼び出すと、実際にはシェルスクリプトが呼び出され、次の出力が表示されます。-

0コードのインポート
1データベース内の既存のデータをバックアップします。

問題は、eval "git pull -u origin master"コマンドが実行されず、その出力が表示されないことです。問題が何であるかについて何か考えはありますか?

4

4 に答える 4

4

これは機能します

<?php
$output = shell_exec('sh deploy.sh');
echo "$output";
?>

その前に、ファイルにchmod 777権限があることを確認してください。

于 2014-08-19T09:23:54.053 に答える
3

phpでシェルコマンドを実行しないようにする必要があります。

そうは言っても、これを試してください:

$output = shell_exec('./deploy.sh');
echo "<pre>".$output."</pre>";

によると:http ://www.php.net/manual/en/function.shell-exec.php

于 2013-02-25T05:32:04.590 に答える
3

この関数でできることの 1 つexec()は、さらに洞察を得るために 2 つのオプションの値を渡すことです。

Web インターフェイスからシェル スクリプトをテストするために使用するコードを次に示します。

<?php
require_once(__DIR__.'/../libs/Render.php');
error_reporting(E_ALL);


//Initialize and Run Command, with a little trick to avoid certain issues
$target='cd ../../your/relative/path && ./CustomScript.sh';
$outbuf=exec($target,$stdoutbuf, $returnbuf);


//Structure
$htm=                           new renderable('html');
$html->children[]=  $head=      new renderable('head');
$html->children[]=  $body=      new renderable('body');
$body->children[]=  $out=       new renderable('div');
$body->children[]=  $stdout=    new renderable('div');
$body->children[]=  $returnout= new renderable('div');


//Value
$out->content=         'OUTPUT: '.$outbuf;
$stdout->content=      'STDOUT: '.var_export($stdoutbuf,true);
$returnout->content=   'RETURN: '.$returnbuf; //127 == Pathing problem


//Output
print_r($html->render());
?>

ファイルは、私がこれを使用しているプロジェクトのレンダリング可能なクラスを使用していますが、使用している場所に文字列出力を配置することもecho/print_r()、同様に配置することもできます。また、phpinfo(); を実行して、セーフ モードになっていないことを確認してください。多くの人がその問題を抱えています。

さらに、PHP でシェル スクリプトの使用を避けるべき理由はありません。PHP はスクリプト言語であるため、多くのシェル スクリプトを集約して高レベルの管理を可能にするのは非常に倹約的です。

PHP は「Web サイト」だけのものではありません。それでも、管理スクリプトを Web インターフェースに公開すること自体は非常に便利です。場合によっては、これがプロジェクトの要件になることもあります。

于 2013-11-16T13:22:28.027 に答える