我在/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");
?>
2011年5月4日更新:
我将www-data ALL=(ALL) NOPASSWD:ALL
添加到/etc/sudoers中,它可以工作,但这是非常不安全的。有没有其他方法可以做到这一点?
发布于 2011-05-04 19:34:37
您可能禁用了exec权限,大多数LAMP程序包都禁用了这些权限。检查您的php.ini中是否有以下行:
disable_functions = exec
如果有exec和shell_exec条目,请将其删除。
祝好运!
发布于 2013-03-29 21:25:04
对于如何让shell exec找到您的脚本,Residuum确实提供了正确的答案,但是关于安全性,有几点。
我想你不希望你的shell脚本在你的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 to /etc/sudoers works
您可以对此进行修改,使其仅涵盖脚本中需要sudo的特定命令。否则,如果sh脚本中的命令都不需要sudo来执行,则根本不需要执行此操作。
尝试以apache用户身份运行该脚本(使用su命令切换到apache用户),如果没有提示您输入sudo或授予权限被拒绝等,就可以了。
即:
sudo su apache (or www-data)
cd /var/www
sh ./myscript
还有..。让我来到这里的原因是,我想使用动态生成的命令运行一个多行shell脚本。我希望我的所有命令都在同一个shell中运行,这不会在多次调用shell_exec()时发生。答案是像Jenkins那样创建动态生成多行命令,将其放在一个变量中,将其保存到temp文件夹中的一个文件中,执行该文件(在() php中使用shell_exec,因为Jenkins是Java),然后对输出做任何您想做的事情,并删除临时文件
..。瞧!
发布于 2017-07-10 22:38:22
如果您有一个需要运行的小脚本(我只需要复制一个文件),我发现在PHP脚本上调用命令要容易得多,方法是调用
exec("sudo cp /tmp/testfile1 /var/www/html/testfile2");
并且通过编辑(或者更确切地说是添加)到sudoer的允许行来启用这样的事务,方法是首先调用sudo visudo
并将以下行添加到它的最后
www-data ALL=(ALL) NOPASSWD:/bin/cp /tmp/testfile1 /var/www/html/testfile2
我想要做的就是复制一个文件,但是由于root密码问题,我一直有这样做的问题,正如您所提到的,我不想让系统对所有root事务都没有密码。
https://stackoverflow.com/questions/5882650
复制相似问题