如何在PHP中执行Shell脚本?

How to execute a shell script in PHP?

我在/var/www/myscript.sh中有一个脚本,该脚本创建文件夹并为我的项目运行命令svn update。 我需要通过在浏览器中的PHP文件(即Localhost / test.php)中调用该脚本来执行该脚本。 我尝试使用功能shell_exec()exec(),但这些功能无效。 我用su www-data && ./myscript.sh在终端中运行了我的shell脚本,它起作用了。 我还想念什么?

1
2
3
<?php
$output = shell_exec("./myscript.sh");
?>

2011年5月4日更新:

我在/ etc / sudoers中添加了www-data ALL=(ALL) NOPASSWD:ALL,它可以工作,但这是非常不安全的。 还有另一种方法吗?


几种可能性:

  • 您已启用安全模式。这样,只有exec()在起作用,然后才在safe_mode_exec_dir中的可执行文件上起作用
  • execshell_exec在php.ini中被禁用
  • 可执行文件的路径错误。如果脚本与php文件位于同一目录中,请尝试exec(dirname(__FILE__) . '/myscript.sh');

您可能已禁用了exec特权,大多数LAMP软件包都已禁用了那些特权。检查您的php.ini中的这一行:

1
disable_functions = exec

并删除exec,shell_exec条目(如果有)。

祝好运!


Residuum确实为如何让Shell exec查找脚本提供了正确的答案,但是在安全性方面有两点。

我想您不希望将Shell脚本放在您的Web根目录中,因为只要有Web访问您的服务器的人都可以看到它。

我建议将Shell脚本移到webroot之外

1
2
3
4
5
6
7
    <?php
      $tempFolder = '/tmp';
      $webRootFolder = '/var/www';
      $scriptName = 'myscript.sh';
      $moveCommand ="mv $webRootFolder/$scriptName $tempFolder/$scriptName";
      $output = shell_exec($moveCommand);
    ?>

关于:

我在/ etc / sudoers中添加了www-data ALL =(ALL)NOPASSWD:ALL

您可以对其进行修改,使其仅覆盖脚本中需要sudo的特定命令。否则,如果sh脚本中的任何命令都不需要sudo来执行,则无论如何都不需要这样做。

尝试以apache用户身份运行脚本(使用su命令切换到apache用户),如果没有提示您输入sudo或被拒绝授予权限等,那会很好。

即:

1
2
3
sudo su apache (or www-data)
cd /var/www
sh ./myscript

另外...让我来到这里的是我想使用动态生成的命令来运行多行shell脚本。我希望所有命令都在同一外壳中运行,而不会通过多次调用shell_exec()来实现。答案就是像Jenkins那样做-创建动态生成的多行命令,将其放入变量中,将其保存到temp文件夹中的文件中,执行该文件(使用shell_exec in()php作为Jenkins Java),然后对输出执行任何操作,然后删除临时文件

...瞧


如果您有一个需要运行的小脚本(我只需要复制一个文件),我发现通过调用以下命令可以更轻松地调用PHP脚本上的命令

1
exec("sudo cp /tmp/testfile1 /var/www/html/testfile2");

并通过首先调用sudo visudo并在其末尾添加以下行来编辑(或添加)许可行到sudoers来启用该事务

1
www-data ALL=(ALL) NOPASSWD:/bin/cp /tmp/testfile1 /var/www/html/testfile2

我只想复制一个文件,由于root密码问题,我一直遇到问题,正如您提到的,我不想让系统不为所有root事务提供密码。