How to execute a shell script in PHP?
我在/var/www/myscript.sh中有一个脚本,该脚本创建文件夹并为我的项目运行命令
1 2 3 |
2011年5月4日更新:
我在/ etc / sudoers中添加了
几种可能性:
-
您已启用安全模式。这样,只有
exec() 在起作用,然后才在safe_mode_exec_dir 中的可执行文件上起作用 -
exec 和shell_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 |
并通过首先调用
1 | www-data ALL=(ALL) NOPASSWD:/bin/cp /tmp/testfile1 /var/www/html/testfile2 |
我只想复制一个文件,由于root密码问题,我一直遇到问题,正如您提到的,我不想让系统不为所有root事务提供密码。