我在 /var/www/myscript.sh 中有一个脚本,它创建文件夹并为我的项目运行命令svn update
。我需要通过在浏览器中的PHP文件中调用它来执行此脚本(即 Localhost / test.php )。我尝试使用函数shell_exec()
和exec()
,但这些函数不起作用。我使用su www-data && ./myscript.sh
在终端中运行我的shell脚本并且它有效。我还缺少什么?
<?php
$output = shell_exec("./myscript.sh");
?>
我将www-data ALL=(ALL) NOPASSWD:ALL
添加到/ etc / sudoers并且它有效,但这是非常不安全的。还有另一种方法吗?
答案 0 :(得分:12)
几种可能性:
exec()
正在运行,而且只有safe_mode_exec_dir
exec
和shell_exec
exec(dirname(__FILE__) . '/myscript.sh');
答案 1 :(得分:7)
您可能已禁用exec权限,大多数LAMP包都禁用了这些权限。检查你的php.ini这一行:
disable_functions = exec
并删除exec,shell_exec条目(如果有)。
祝你好运!
答案 2 :(得分: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);
?>
关于:
我添加了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
另外......带给我的是我想要使用动态生成的命令运行多行shell脚本。我希望我的所有命令都在同一个shell中运行,使用多次调用shell_exec()时不会发生这种情况。这个问题的答案是像Jenkins一样 - 创建动态生成的多行命令,将其放入变量中,将其保存到临时文件夹中的文件中,执行该文件(使用shell中的shell_exec,因为Jenkins是Java),然后对输出执行任何操作,并删除临时文件
...瞧
答案 3 :(得分:1)
如果你有一个需要运行的小脚本(我只需要复制一个文件),我发现通过调用
来调用PHP脚本上的命令要容易得多exec("sudo cp /tmp/testfile1 /var/www/html/testfile2");
通过首先调用sudo visudo
并在其最后添加以下行来编辑(或者更确切地说)向sudoers添加许可行来启用此类交易
www-data ALL=(ALL) NOPASSWD:/bin/cp /tmp/testfile1 /var/www/html/testfile2
我想要做的就是复制一个文件,因为root密码问题,我一直遇到问题,正如你所提到的,我不想让系统公开所有根事务都没有密码。