我有一个shell脚本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 Importing the code
remote: Counting objects: 5, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 1), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From bitbucket.org:user/repo * branch master -> FETCH_HEAD Updating db13xxx..6705xxx
1 Backing up existing data in database..
这是对的。但是,我编写了一个PHP脚本,我可以通过http来调用deploy.sh脚本。这个php页面的内容如下: -
$output = `./deploy.sh`;
echo '<pre>', $output, '</pre>';
当我通过浏览器调用这个php文件时,shell脚本实际上被调用了,我得到以下输出: -
0 Importing the code 1 Backing up existing data in database..
问题是eval "git pull -u origin master"
命令没有执行,并且没有显示其输出。知道问题是什么吗?
答案 0 :(得分:4)
这有效
<?php
$output = shell_exec('sh deploy.sh');
echo "$output";
?>
在此之前,请确保该文件具有 chmod 777 权限。
答案 1 :(得分:3)
你应该尽量避免在php中运行shell命令。
话虽如此,试试这个:
$output = shell_exec('./deploy.sh');
echo "<pre>".$output."</pre>";
答案 2 :(得分:3)
使用exec()
函数可以做的一件事是传递两个可选值以获得更多洞察力。
这是我用来从Web界面测试shell脚本的一些代码。
<?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());
?>
文件正在使用我在其中使用的项目中的renderable class,但您可以将字符串输出放在您使用它的地方或echo/print_r()
。还要确保运行phpinfo()时不处于安全模式;很多人都有这个问题。
此外,您没有理由避免在PHP中使用shell脚本。 PHP是一种脚本语言,在聚合许多shell脚本以允许更高级别的管理方面非常节俭。
PHP不仅适用于'网站'。即便如此,将管理脚本暴露给Web界面本身也是非常有用的;偶尔这甚至是项目要求。
答案 3 :(得分:-2)
这是正确的代码
<?php
$cmd = 'ifconfig'; // pass command here
echo "<pre>".shell_exec($cmd)."</pre>";
?>