如何在PHP中执行shell脚本?

Rak*_*esh 21 php shell

我在/var/www/myscript.sh中有一个脚本,它创建文件夹并运行svn update我的项目命令.我需要通过在浏览器中的PHP文件中调用它来执行此脚本(即Localhost/test.php).我尝试使用函数shell_exec(),exec()但那些不起作用.我在终端运行我的shell脚本su www-data && ./myscript.sh,它工作正常.我还缺少什么?

<?php
$output = shell_exec("./myscript.sh");
?>
Run Code Online (Sandbox Code Playgroud)

2011年5月4日更新:

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

Res*_*uum 12

几种可能性:

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


Gab*_*gra 7

您可能已禁用exec权限,大多数LAMP包都禁用了这些权限.检查你的php.ini这行:

disable_functions = exec
Run Code Online (Sandbox Code Playgroud)

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

祝好运!

  • 对于OP来说,检查他们试图执行的目录中的`rwx`权限也是明智之举. (2认同)

Pha*_*ols 6

Residuum确实为你应该如何让shell exec找到你的脚本提供了正确的答案,但是在安全方面,有几点.

我想你不希望你的shell脚本在你的web根目录中,因为任何有web访问你服务器的人都可以看到它.

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

    <?php
      $tempFolder = '/tmp';
      $webRootFolder = '/var/www';
      $scriptName = 'myscript.sh';
      $moveCommand = "mv $webRootFolder/$scriptName $tempFolder/$scriptName";
      $output = shell_exec($moveCommand);
    ?>
Run Code Online (Sandbox Code Playgroud)

关于:

我添加了www-data ALL =(ALL)NOPASSWD:ALL到/ etc/sudoers的工作原理

您可以将其修改为仅涵盖脚本中需要sudo的特定命令.否则,如果sh脚本中的所有命令都不需要执行sudo,则无论如何都不需要执行此操作.

尝试以apache用户身份运行脚本(使用su命令切换到apache用户),如果没有提示你输入sudo或者给予权限拒绝等,那就没关系了.

即:

sudo su apache (or www-data)
cd /var/www
sh ./myscript
Run Code Online (Sandbox Code Playgroud)

另外......带给我的是我想使用动态生成的命令运行多行shell脚本.我希望我的所有命令都在同一个shell中运行,使用多次调用shell_exec()时不会发生这种情况.这个问题的答案是像Jenkins一样 - 创建动态生成的多行命令,将其放入变量中,将其保存到临时文件夹中的文件中,执行该文件(使用shell中的shell_exec,因为Jenkins是Java),然后对输出执行任何操作,并删除临时文件