首页 > 解决方案 > SSH 和 exec() 用户不同

问题描述

我在 AWS 中有一个Lightsail实例,它是一个 LAMP 堆栈。以前,我(或bitnami,不确定)为 SSL 创建了一个 cron。它看起来像这样:

0 0 * * * sudo /opt/bitnami/letsencrypt/lego --path /o...

如果我通过 SSH 连接并运行crontab -l,我会得到以下输出(第二个 cron 用于测试目的):

0 0 * * * sudo /opt/bitnami/letsencrypt/lego --path /o...

* * * * * sudo /usr/bin/touch /opt/bitnami/apache2/htdocs/.htaccess

现在,我正在考虑添加更多与应用程序相关的 cron 作业。手动添加 cron 作业(通过 SSH)很乏味。我希望能够在 UI 中执行此操作。我之所以这么说是因为我已经看到这样做了(例如在 DirectAdmin、Plesk Panel、WHMCS 等中)

所以我开始寻找在 PHP 中查看/编辑/删除 cron 作业的方法。这个想法似乎很简单。获取当前的 cron 作业 ( crontabs -l),解析和修改它们,然后将其加载回来 ( crontabs file)。因此,我尝试获取当前的 cron 作业(在 PHP 文件中,从浏览器中),但失败了:

exec("crontab -l", $crons);
exec("crontab -u bitnami -l", $crons_bitnami);

exec("sudo crontab -l", $sudo_crons);
exec("sudo crontab -u bitnami -l", $sudo_crons_bitnami);

var_dump(exec("whoami")); // daemon
var_dump(shell_exec("crontab -l")); // NULL

var_dump($crons);         // array(0) { }
var_dump($crons_bitnami); // array(0) { }

var_dump($sudo_crons);         // array(0) { }
var_dump($sudo_crons_bitnami); // array(0) { }

我得到空的结果。如果我crontabs -l在 SSH 中运行,我会得到我添加的两个 cron 作业,但这在 PHP 中不起作用。所以我检查了用户。如果我输入whoamiSSH,我会得到bitnami. 在 PHP 中,它返回daemon. 我进行了更多搜索,发现每个用户都有自己的 cron 作业。在 SSH 中,我是用户bitnami,它有两个 cron 作业。为什么我daemon在 PHP 中?这就是我得到空结果的原因吗?如果是这样,我可以/如何更改它?

我在其他服务器上测试了相同的代码,我似乎得到了正确的结果。用户不是daemon,我可以看到 cron 作业。所以这可能与 Lightsail/bitnami 相关。不过,有什么办法可以解决吗?

标签: phpcronexecbitnamiamazon-lightsail

解决方案


推荐阅读