我在/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)
我添加www-data ALL=(ALL) NOPASSWD:ALL到/ etc/sudoers并且它可以工作,但这是非常不安全的.还有另一种方法吗?
Res*_*uum 12
几种可能性:
exec()工作,然后只有可执行文件safe_mode_exec_dir exec并shell_exec在php.ini中被禁用exec(dirname(__FILE__) . '/myscript.sh');您可能已禁用exec权限,大多数LAMP包都禁用了这些权限.检查你的php.ini这行:
disable_functions = exec
Run Code Online (Sandbox Code Playgroud)
并删除exec,shell_exec条目(如果有).
祝好运!
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),然后对输出执行任何操作,并删除临时文件
瞧
| 归档时间: |
|
| 查看次数: |
115776 次 |
| 最近记录: |