我在/var/www/myscript.sh中有一个脚本,它创建文件夹并运行svn update
我的项目命令.我需要通过在浏览器中的PHP文件中调用它来执行此脚本(即Localhost/test.php).我尝试使用函数shell_exec()
,exec()
但那些不起作用.我在终端运行我的shell脚本su www-data && ./myscript.sh
,它工作正常.我还缺少什么?
我添加www-data ALL=(ALL) NOPASSWD:ALL
到/ etc/sudoers并且它可以工作,但这是非常不安全的.还有另一种方法吗?
几种可能性:
您已启用安全模式.这样,只有exec()
工作,然后只有可执行文件safe_mode_exec_dir
exec
并shell_exec
在php.ini中被禁用
可执行文件的路径是错误的.如果脚本与php文件在同一目录中,请尝试exec(dirname(__FILE__) . '/myscript.sh');
您可能已禁用exec权限,大多数LAMP包都禁用了这些权限.检查你的php.ini这行:
disable_functions = exec
并删除exec,shell_exec条目(如果有).
祝好运!
Residuum确实为你应该如何让shell exec找到你的脚本提供了正确的答案,但是在安全方面,有几点.
我想你不希望你的shell脚本在你的web根目录中,因为任何有web访问你服务器的人都可以看到它.
我建议将shell脚本移到webroot之外
关于:
我添加了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),然后对输出执行任何操作,并删除临时文件
瞧