使用 PHP 执行 shell 脚本的权限问题

文章目录

上一篇讲使用 GitHub webhook 来部署的问题,其中一步是用 PHP 执行一段 shell 脚本。类似于如下的 PHP 代码:

1
2
<?php
shell_exec('cd somepath && git pull --rebase');

把这段代码保存为 test.php,在终端中使用 php test.php 执行可以得到正确的结果,但是在浏览器中访问这个 PHP 却不行。

除了安全模式、shell_exec 被禁用的问题之外,最大的可能是运行权限的问题。尝试在终端与浏览器中访问包含以下代码的 PHP 文件:

1
2
<?php
shell_exec('whoami');

十有八九会的到不同的结果,例如在终端中是 alan(我的登录账户),在浏览器中是 www(Nginx 的账户)。因此在浏览器中时 PHP 是以 www 去执行 git pull 的,这就会有权限问题。

可以让 www 账户表现得像 alan 账户,但是非常不推荐。最好的办法就是在终端里切换到 www 用户再重新 git clone,让本地 repo 的所有权为 www,即可。